This commit is contained in:
selfhoster selfhoster 2023-10-05 17:58:41 +02:00
commit 89ef66a694
19 changed files with 461 additions and 64 deletions

View file

@ -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>;
}