TRUC
This commit is contained in:
parent
7d9e3d63b7
commit
89ef66a694
19 changed files with 461 additions and 64 deletions
|
|
@ -1,4 +1,4 @@
|
|||
use serde::Serialize;
|
||||
use serde::{Serialize, Deserialize, Deserializer};
|
||||
|
||||
use crate::{Module, ModuleSetup};
|
||||
use crate::facts::{Facts, os::OsFamily};
|
||||
|
|
@ -19,12 +19,25 @@ pub use builder::{PackageArgsBuilder, NoManager};
|
|||
|
||||
pub type PackageStatus = ();
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct PackageArgs {
|
||||
name: PackageList,
|
||||
state: PackageState,
|
||||
}
|
||||
|
||||
impl ModuleSetup<PackageModule<Box<dyn PackageManager>>, PackageArgs, (), PackageError> for PackageArgs {
|
||||
fn with_facts(self, facts: &Facts) -> PackageModule<Box<dyn PackageManager>> {
|
||||
let manager: Box<dyn PackageManager> = match facts.os.family() {
|
||||
OsFamily::Debian => Box::new(AptManager),
|
||||
OsFamily::Archlinux => Box::new(PacmanManager),
|
||||
};
|
||||
|
||||
PackageModule {
|
||||
args: self,
|
||||
manager,
|
||||
}
|
||||
}
|
||||
}
|
||||
#[derive(Clone, Debug, PartialEq, Eq, Serialize)]
|
||||
pub enum PackageState {
|
||||
Present,
|
||||
|
|
@ -32,6 +45,21 @@ pub enum PackageState {
|
|||
Latest,
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for PackageState {
|
||||
fn deserialize<D>(de: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let variant = String::deserialize(de)?;
|
||||
Ok(match variant.as_str() {
|
||||
"present" => PackageState::Present,
|
||||
"absent" => PackageState::Absent,
|
||||
"latest" => PackageState::Latest,
|
||||
_other => unimplemented!(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct PackageModule<Manager> {
|
||||
manager: Manager,
|
||||
|
|
@ -78,6 +106,12 @@ impl ModuleSetup<PackageModule<Box<dyn PackageManager>>, PackageArgs, (), Packag
|
|||
}
|
||||
}
|
||||
|
||||
// Stupid impl just for tests
|
||||
impl ModuleSetup<PackageModule<Box<dyn PackageManager>>, PackageArgs, (), PackageError> for PackageModule<Box<dyn PackageManager>> {
|
||||
fn with_facts(self, _facts: &Facts) -> PackageModule<Box<dyn PackageManager>> {
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl PackageModule<NoManager> {
|
||||
pub fn new() -> PackageArgsBuilder<builder::NoPackage, builder::NoState, builder::NoManager> {
|
||||
|
|
@ -100,6 +134,7 @@ impl From<std::io::Error> for PackageError {
|
|||
pub trait PackageManager: std::fmt::Debug {
|
||||
fn name(&self) -> &'static str;
|
||||
fn update(&self) -> Result<(), PackageError>;
|
||||
fn is_installed(&self, pkg: &str) -> Result<bool, PackageError>;
|
||||
fn install(&self, list: PackageList) -> Result<(), PackageError>;
|
||||
fn remove(&self, list: PackageList) -> Result<(), PackageError>;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue