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.

83 lines
1.8 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
5 years ago
7 years ago
7 years ago
5 years ago
7 years ago
8 years ago
7 years ago
7 years ago
7 years ago
8 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. use std::error::Error;
  2. use std::fmt::Display;
  3. use resources::Resource;
  4. pub trait Action {
  5. fn run(&self) -> Result<(), Box<Error>>;
  6. }
  7. pub trait SymbolRunner {
  8. fn run_symbol(&self, symbol: &Symbol) -> Result<(), Box<Error>>;
  9. }
  10. impl<R: SymbolRunner + ?Sized> SymbolRunner for Box<R> {
  11. fn run_symbol(&self, symbol: &Symbol) -> Result<(), Box<Error>> {
  12. (**self).run_symbol(symbol)
  13. }
  14. }
  15. // Symbol
  16. pub trait Symbol: Display {
  17. fn target_reached(&self) -> Result<bool, Box<Error>>;
  18. fn execute(&self) -> Result<(), Box<Error>>;
  19. fn get_prerequisites(&self) -> Vec<Resource> {
  20. vec![]
  21. }
  22. fn provides(&self) -> Option<Vec<Resource>> {
  23. None
  24. }
  25. fn as_action<'a>(&'a self, runner: &'a SymbolRunner) -> Box<Action + 'a>;
  26. fn into_action<'a>(self: Box<Self>, runner: &'a SymbolRunner) -> Box<Action + 'a> where Self: 'a;
  27. }
  28. // SymbolAction
  29. pub struct SymbolAction<'a, S: Symbol + 'a> {
  30. runner: &'a SymbolRunner,
  31. symbol: &'a S
  32. }
  33. impl<'a, S: Symbol> SymbolAction<'a, S> {
  34. pub fn new(runner: &'a SymbolRunner, symbol: &'a S) -> Self {
  35. Self { runner, symbol }
  36. }
  37. }
  38. impl<'a, S: Symbol> Action for SymbolAction<'a, S> {
  39. fn run(&self) -> Result<(), Box<Error>> {
  40. self.runner.run_symbol(self.symbol)
  41. }
  42. }
  43. pub struct OwnedSymbolAction<'a, S: Symbol + 'a> {
  44. runner: &'a SymbolRunner,
  45. symbol: S
  46. }
  47. impl<'a, S: Symbol + 'a> OwnedSymbolAction<'a, S> {
  48. pub fn new(runner: &'a SymbolRunner, symbol: S) -> Self {
  49. Self { runner, symbol }
  50. }
  51. }
  52. impl<'a, S: Symbol + 'a> Action for OwnedSymbolAction<'a, S> {
  53. fn run(&self) -> Result<(), Box<Error>> {
  54. self.runner.run_symbol(&self.symbol)
  55. }
  56. }
  57. pub mod acme;
  58. pub mod dir;
  59. pub mod factory;
  60. pub mod file;
  61. pub mod git;
  62. pub mod hook;
  63. pub mod list;
  64. pub mod mariadb;
  65. pub mod nginx;
  66. pub mod npm;
  67. pub mod owner;
  68. pub mod stored_directory;
  69. pub mod systemd;
  70. pub mod tls;
  71. pub mod user;
  72. pub mod wordpress;