You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.0 KiB
88 lines
2.0 KiB
use crate::resources::Resource;
|
|
use std::error::Error;
|
|
use std::fmt::Display;
|
|
|
|
pub trait Action {
|
|
fn run(&self) -> Result<(), Box<dyn Error>>;
|
|
}
|
|
|
|
pub trait SymbolRunner {
|
|
fn run_symbol(&self, symbol: &dyn Symbol) -> Result<(), Box<dyn Error>>;
|
|
}
|
|
|
|
impl<R: SymbolRunner + ?Sized> SymbolRunner for Box<R> {
|
|
fn run_symbol(&self, symbol: &dyn Symbol) -> Result<(), Box<dyn Error>> {
|
|
(**self).run_symbol(symbol)
|
|
}
|
|
}
|
|
|
|
// Symbol
|
|
pub trait Symbol: Display {
|
|
fn target_reached(&self) -> Result<bool, Box<dyn Error>>;
|
|
fn execute(&self) -> Result<(), Box<dyn Error>>;
|
|
fn get_prerequisites(&self) -> Vec<Resource> {
|
|
vec![]
|
|
}
|
|
fn provides(&self) -> Option<Vec<Resource>> {
|
|
None
|
|
}
|
|
fn as_action<'a>(&'a self, runner: &'a dyn SymbolRunner) -> Box<dyn Action + 'a>;
|
|
fn into_action<'a>(self: Box<Self>, runner: &'a dyn SymbolRunner) -> Box<dyn Action + 'a>
|
|
where
|
|
Self: 'a;
|
|
}
|
|
|
|
// SymbolAction
|
|
pub struct SymbolAction<'a, S: Symbol> {
|
|
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<S: Symbol> Action for SymbolAction<'_, S> {
|
|
fn run(&self) -> Result<(), Box<dyn Error>> {
|
|
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<dyn Error>> {
|
|
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;
|