use resources::Resource; use std::error::Error; use std::fmt::Display; pub trait Action { fn run(&self) -> Result<(), Box>; } pub trait SymbolRunner { fn run_symbol(&self, symbol: &dyn Symbol) -> Result<(), Box>; } impl SymbolRunner for Box { fn run_symbol(&self, symbol: &dyn Symbol) -> Result<(), Box> { (**self).run_symbol(symbol) } } // Symbol pub trait Symbol: Display { fn target_reached(&self) -> Result>; fn execute(&self) -> Result<(), Box>; fn get_prerequisites(&self) -> Vec { vec![] } fn provides(&self) -> Option> { None } fn as_action<'a>(&'a self, runner: &'a dyn SymbolRunner) -> Box; fn into_action<'a>(self: Box, runner: &'a dyn SymbolRunner) -> Box where Self: 'a; } // SymbolAction pub struct SymbolAction<'a, S: Symbol + 'a> { runner: &'a dyn SymbolRunner, symbol: &'a S, } impl<'a, S: Symbol> SymbolAction<'a, S> { pub fn new(runner: &'a dyn SymbolRunner, symbol: &'a S) -> Self { Self { runner, symbol } } } impl<'a, S: Symbol> Action for SymbolAction<'a, S> { fn run(&self) -> Result<(), Box> { self.runner.run_symbol(self.symbol) } } pub struct OwnedSymbolAction<'a, S: Symbol + 'a> { runner: &'a dyn SymbolRunner, symbol: S, } impl<'a, S: Symbol + 'a> OwnedSymbolAction<'a, S> { pub fn new(runner: &'a dyn SymbolRunner, symbol: S) -> Self { Self { runner, symbol } } } impl<'a, S: Symbol + 'a> Action for OwnedSymbolAction<'a, S> { fn run(&self) -> Result<(), Box> { self.runner.run_symbol(&self.symbol) } } pub mod acme; pub mod cron; pub mod dir; pub mod factory; pub mod file; pub mod git; pub mod hook; pub mod list; pub mod mariadb; pub mod nginx; pub mod noop; pub mod npm; pub mod owner; pub mod postgresql; pub mod stored_directory; pub mod systemd; pub mod tls; pub mod user; pub mod wordpress;