use super::{PackageArgs, IntoPackageList, PackageList, PackageState, PackageModule, PackageStatus, PackageError, SpecificPackageManager}; use super::apt::DebianPackageManager; use super::pacman::ArchlinuxPackageManager; use std::boxed::Box; use crate::Module; pub struct PackageArgsBuilder { name: Packages, state: State, manager: Manager, } pub struct NoPackage; pub struct NoState; pub struct NoManager; impl PackageArgsBuilder { pub fn new() -> PackageArgsBuilder { PackageArgsBuilder { name: NoPackage, state: NoState, manager: NoManager, } } } impl PackageArgsBuilder { pub fn name(self, list: T) -> PackageArgsBuilder { let Self { state, manager, .. } = self; PackageArgsBuilder { name: list.into_package_list(), state, manager, } } } impl PackageArgsBuilder { pub fn state(self, state: PackageState) -> PackageArgsBuilder { let Self { name, manager, .. } = self; PackageArgsBuilder { name, state, manager, } } } impl PackageArgsBuilder { pub fn with(self, manager: impl SpecificPackageManager + 'static) -> PackageArgsBuilder> { let Self { name, state, .. } = self; PackageArgsBuilder { name, state, manager: Box::new(manager), } } pub fn with_apt(self) -> PackageArgsBuilder> { let Self { name, state, .. } = self; PackageArgsBuilder { name, state, manager: Box::new(DebianPackageManager), } } pub fn with_pacman(self) -> PackageArgsBuilder> { let Self { name, state, .. } = self; PackageArgsBuilder { name, state, manager: Box::new(ArchlinuxPackageManager), } } } // We can only RUN the args when a package manager has been set. Alternatively, // when called inside a playbook, the package manager can be populated automatically from facts. impl PackageArgsBuilder> { pub fn run(self) -> Result { self.build().run() } } impl PackageArgsBuilder> { pub fn build(self) -> PackageModule> { let Self { name, state, manager, .. } = self; PackageModule { args: PackageArgs { name, state, }, manager, } } } impl PackageArgsBuilder { pub fn build(self) -> PackageModule { let Self { name, state, .. } = self; PackageModule { args: PackageArgs { name, state, }, manager: NoManager, } } }