docs: complete Backend trait

This commit is contained in:
steven-omaha
2023-03-03 17:57:05 +01:00
parent 83865e21e9
commit e164416d33
@@ -11,20 +11,44 @@ use crate::{Group, Package};
pub(in crate::backend) type Switches = &'static [&'static str]; pub(in crate::backend) type Switches = &'static [&'static str];
pub(in crate::backend) type Text = &'static str; pub(in crate::backend) type Text = &'static str;
/// The trait of a struct that is used as a backend.
pub trait Backend: Debug { pub trait Backend: Debug {
/// Return the actual binary. Iff the backend supports different
/// binaries, you will need to overwrite this implementation to return
/// the binary that was loaded at runtime. See
/// [`Backend::get_binary_default()`].
fn get_binary(&self) -> Text { fn get_binary(&self) -> Text {
self.get_binary_default() self.get_binary_default()
} }
/// Return the default binary as defined in the constant of the module.
/// See [`Backend::get_binary()`].
fn get_binary_default(&self) -> Text; fn get_binary_default(&self) -> Text;
/// Get the name of the section in the group files.
fn get_section(&self) -> Text; fn get_section(&self) -> Text;
/// Get CLI switches for the package manager to show information for
/// packages.
fn get_switches_info(&self) -> Switches; fn get_switches_info(&self) -> Switches;
/// Get CLI switches for the package manager to install packages.
fn get_switches_install(&self) -> Switches; fn get_switches_install(&self) -> Switches;
/// Get CLI switches for the package manager to remove packages.
fn get_switches_remove(&self) -> Switches; fn get_switches_remove(&self) -> Switches;
/// Get CLI switches for the package manager to mark packages as
/// dependency. This is not supported by all package managers. See
/// [`Backend::supports_as_dependency`].
fn get_switches_make_dependency(&self) -> Switches; fn get_switches_make_dependency(&self) -> Switches;
/// Load all packages from a set of groups. The backend will visit all groups,
/// find its own section, and clone all packages into its own struct.
fn load(&mut self, groups: &HashSet<Group>); fn load(&mut self, groups: &HashSet<Group>);
/// Get all managed packages for this backend, i.e. all packages
/// under the corresponding section in all group files.
fn get_managed_packages(&self) -> &HashSet<Package>; fn get_managed_packages(&self) -> &HashSet<Package>;
/// Get all packages that are installed in the system. /// Get all packages that are installed in the system.
@@ -33,6 +57,8 @@ pub trait Backend: Debug {
/// Get all packages that were installed in the system explicitly. /// Get all packages that were installed in the system explicitly.
fn get_explicitly_installed_packages(&self) -> Result<HashSet<Package>>; fn get_explicitly_installed_packages(&self) -> Result<HashSet<Package>>;
/// Assign each of the packages to an individual group by editing the
/// group files.
fn assign_group(&self, to_assign: Vec<(Package, Rc<Group>)>) -> Result<()> { fn assign_group(&self, to_assign: Vec<(Package, Rc<Group>)>) -> Result<()> {
let group_package_map = get_group_packages_map(to_assign); let group_package_map = get_group_packages_map(to_assign);
let section_header = format!("[{}]", self.get_section()); let section_header = format!("[{}]", self.get_section());
@@ -55,6 +81,8 @@ pub trait Backend: Debug {
.with_context(|| format!("running command {cmd:?}")) .with_context(|| format!("running command {cmd:?}"))
} }
/// Mark the packages as non-explicit / dependency using the underlying
/// package manager.
fn make_dependency(&self, packages: &[Package]) -> Result<ExitStatus> { fn make_dependency(&self, packages: &[Package]) -> Result<ExitStatus> {
let mut cmd = Command::new(self.get_binary()); let mut cmd = Command::new(self.get_binary());
cmd.args(self.get_switches_make_dependency()); cmd.args(self.get_switches_make_dependency());
@@ -76,7 +104,7 @@ pub trait Backend: Debug {
.with_context(|| format!("running command [{cmd:?}]")) .with_context(|| format!("running command [{cmd:?}]"))
} }
/// extract packages from its own section as read from group files /// TODO remove.
fn extract_packages_from_group_file_content(&self, content: &str) -> HashSet<Package> { fn extract_packages_from_group_file_content(&self, content: &str) -> HashSet<Package> {
content content
.lines() .lines()
@@ -88,6 +116,7 @@ pub trait Backend: Debug {
.collect() .collect()
} }
/// Get missing packages, sorted alphabetically.
fn get_missing_packages_sorted(&self) -> Result<Vec<Package>> { fn get_missing_packages_sorted(&self) -> Result<Vec<Package>> {
let installed = self let installed = self
.get_all_installed_packages() .get_all_installed_packages()
@@ -98,6 +127,7 @@ pub trait Backend: Debug {
Ok(diff) Ok(diff)
} }
/// TODO remove
fn add_packages(&mut self, packages: HashSet<Package>); fn add_packages(&mut self, packages: HashSet<Package>);
/// Show information from package manager for package. /// Show information from package manager for package.
@@ -109,6 +139,7 @@ pub trait Backend: Debug {
.with_context(|| format!("running command {cmd:?}")) .with_context(|| format!("running command {cmd:?}"))
} }
/// Get unmanaged packages, sorted alphabetically.
fn get_unmanaged_packages_sorted(&self) -> Result<Vec<Package>> { fn get_unmanaged_packages_sorted(&self) -> Result<Vec<Package>> {
let installed = self let installed = self
.get_explicitly_installed_packages() .get_explicitly_installed_packages()
@@ -119,8 +150,10 @@ pub trait Backend: Debug {
Ok(diff) Ok(diff)
} }
/// Return a mutable reference to self as `Any`. Required for downcasting.
fn as_any_mut(&mut self) -> &mut dyn Any; fn as_any_mut(&mut self) -> &mut dyn Any;
/// Whether the underlying package manager supports dependency packages.
fn supports_as_dependency(&self) -> bool; fn supports_as_dependency(&self) -> bool;
} }