A library for writing host-specific, single-binary configuration management and deployment tools
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.

84 lines
1.9 KiB

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