diff --git a/crates/pacdef_core/src/backend/backend_trait.rs b/crates/pacdef_core/src/backend/backend_trait.rs index 94066bd..78de8bd 100644 --- a/crates/pacdef_core/src/backend/backend_trait.rs +++ b/crates/pacdef_core/src/backend/backend_trait.rs @@ -1,3 +1,4 @@ +use std::any::Any; use std::collections::{HashMap, HashSet}; use std::fmt::Debug; use std::process::{Command, ExitStatus}; @@ -114,6 +115,8 @@ pub trait Backend: Debug { diff.sort_unstable(); Ok(diff) } + + fn as_any(&mut self) -> &mut dyn Any; } fn get_group_packages_map( diff --git a/crates/pacdef_core/src/backend/macros.rs b/crates/pacdef_core/src/backend/macros.rs index a6fb42a..8934c3e 100644 --- a/crates/pacdef_core/src/backend/macros.rs +++ b/crates/pacdef_core/src/backend/macros.rs @@ -49,5 +49,9 @@ macro_rules! impl_backend_constants { self.packages.insert(p); } } + + fn as_any(&mut self) -> &mut dyn std::any::Any { + self + } }; } diff --git a/crates/pacdef_core/src/core.rs b/crates/pacdef_core/src/core.rs index 88673f8..e68f62f 100644 --- a/crates/pacdef_core/src/core.rs +++ b/crates/pacdef_core/src/core.rs @@ -1,4 +1,3 @@ -use std::any::Any; use std::collections::{HashMap, HashSet}; use std::fs::{remove_file, File}; use std::os::unix::fs::symlink; @@ -94,8 +93,8 @@ impl Pacdef { fn get_missing_packages(&mut self) -> ToDoPerBackend { let mut to_install = ToDoPerBackend::new(); - for backend in Backends::iter() { - let mut backend = self.overwrite_values_from_config(backend); + for mut backend in Backends::iter() { + self.overwrite_values_from_config(&mut *backend); backend.load(&self.groups); @@ -109,16 +108,10 @@ impl Pacdef { } #[allow(clippy::as_conversions)] - fn overwrite_values_from_config(&mut self, backend: Box) -> Box { - let b = Box::new(&backend as &dyn Any); - match b.downcast_ref::() { - Some(inner) => { - let mut arch = inner.clone(); - arch.binary = self.config.aur_helper.clone(); - arch.aur_rm_args = self.config.aur_rm_args.take(); - Box::new(arch) - } - None => backend, + fn overwrite_values_from_config(&mut self, backend: &mut dyn Backend) { + if let Some(arch) = backend.as_any().downcast_mut::() { + arch.binary = self.config.aur_helper.clone(); + arch.aur_rm_args = self.config.aur_rm_args.take(); } } @@ -173,8 +166,8 @@ impl Pacdef { fn get_unmanaged_packages(&mut self) -> ToDoPerBackend { let mut result = ToDoPerBackend::new(); - for backend in Backends::iter() { - let mut backend = self.overwrite_values_from_config(backend); + for mut backend in Backends::iter() { + self.overwrite_values_from_config(&mut *backend); backend.load(&self.groups);