use crate::artifacts::{ DatabaseName as DatabaseNameArtifact, Path as PathArtifact, ServiceName as ServiceNameArtifact, UserName as UserNameArtifact, }; use std::hash::Hash; use std::path::PathBuf; pub trait Resource { type Artifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct Key(pub D); impl Resource for Key { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct Csr(pub D); impl Resource for Csr { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct Cert(pub D); impl Resource for Cert { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct CertChain(pub D); impl Resource for CertChain { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct KeyAndCertBundle(pub D); impl Resource for KeyAndCertBundle { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct File

(pub P, pub String); impl<'a, P> Resource for File

{ type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct GitCheckout<'a, P>(pub P, pub &'a str, pub &'a str); impl<'a, P> Resource for GitCheckout<'a, P> { type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct Dir

(pub P); impl

Resource for Dir

{ type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct UserForDomain(pub D); impl Resource for UserForDomain { type Artifact = (UserNameArtifact, PathArtifact); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct AcmeAccountKey; impl Resource for AcmeAccountKey { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct AcmeUser; impl Resource for AcmeUser { type Artifact = UserNameArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct AcmeRootCert; impl Resource for AcmeRootCert { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct AcmeChallengesDir; impl Resource for AcmeChallengesDir { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct AcmeChallengesNginxSnippet; impl Resource for AcmeChallengesNginxSnippet { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct StoredDirectory

(pub &'static str, pub P); impl

Resource for StoredDirectory

{ type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct LoadedDirectory

(pub &'static str, pub P); impl

Resource for LoadedDirectory

{ type Artifact = PathArtifact; } pub fn get_saved_directory( storage_name: &'static str, target: P, ) -> (StoredDirectory

, LoadedDirectory

) { ( StoredDirectory(storage_name, target.clone()), LoadedDirectory(storage_name, target), ) } #[derive(Debug, Hash, PartialEq, Eq)] pub struct User(pub String); impl Resource for User { type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct SystemdSocketService(pub D, pub &'static str, pub P, pub P, pub bool); impl Resource for SystemdSocketService { type Artifact = (PathArtifact, PathArtifact, UserNameArtifact); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct NpmInstall

(pub P); impl

Resource for NpmInstall

{ type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct Owner

(pub String, pub P); impl

Resource for Owner

{ type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct ServeCustom(pub D, pub String); impl Resource for ServeCustom { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct ServePhp(pub D, pub P, pub &'static str, pub String, pub usize); impl Resource for ServePhp { type Artifact = PathArtifact; } // Domain, service name, exec, static, dir #[derive(Debug, Hash, PartialEq, Eq)] pub struct ServeService(pub D, pub &'static str, pub P, pub P, pub P, pub bool); impl Resource for ServeService { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct ServeRedir(pub D, pub D); impl Resource for ServeRedir { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct ServeStatic(pub D, pub P); impl Resource for ServeStatic { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct DefaultServer; impl Resource for DefaultServer { type Artifact = PathArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct PhpFpmPool(pub D, pub usize); impl Resource for PhpFpmPool { type Artifact = ( PathArtifact, PathArtifact, UserNameArtifact, ServiceNameArtifact, ); } // A single domain could possibly need multiple databases #[derive(Debug, Hash, PartialEq, Eq)] pub struct MariaDbDatabase(pub D); impl Resource for MariaDbDatabase { type Artifact = (DatabaseNameArtifact, UserNameArtifact, PathArtifact); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct MariaDbUser(pub D); impl Resource for MariaDbUser { type Artifact = UserNameArtifact; } #[derive(Debug, Hash, PartialEq, Eq)] pub struct WordpressPlugin

(pub P, pub &'static str); impl

Resource for WordpressPlugin

{ type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct WordpressTranslation

(pub P, pub &'static str, pub &'static str); impl

Resource for WordpressTranslation

{ type Artifact = (); } #[derive(Debug, Hash, PartialEq, Eq)] pub struct Cron(pub D, pub String); impl Resource for Cron { type Artifact = (); } use std::rc::{Rc, Weak}; pub trait FromResource { fn from_resource(from: R) -> (Self, Weak) where Self: Sized; } pub trait FromArtifact { fn from_artifact(from: R::Artifact) -> Self where Self: Sized; fn into_artifact(self) -> R::Artifact where Self: Sized; } macro_rules! default_resources { ( $($name:ident: $type:ty,)* ) => { #[derive(Debug, PartialEq, Eq, Hash)] pub enum DefaultResources<'a, D> { $( $name(Rc<$type>) ),* } $(impl<'a, D> FromResource<$type> for DefaultResources<'a, D> { fn from_resource(from: $type) -> (Self, Weak<$type>) { let inner = Rc::new(from); (Self::$name(Rc::clone(&inner)), Rc::downgrade(&inner)) } })* #[derive(Clone, Debug)] pub enum DefaultArtifacts<'a, D> { $( $name(<$type as Resource>::Artifact) ),* } $(impl<'a, D> FromArtifact<$type> for DefaultArtifacts<'a, D> { fn from_artifact(from: <$type as Resource>::Artifact) -> Self { Self::$name(from) } fn into_artifact(self) -> <$type as Resource>::Artifact { match self { Self::$name(inner) => inner, _ => panic!() } } })* } } default_resources!( AcmeAccountKey: AcmeAccountKey, AcmeChallengesDir: AcmeChallengesDir, AcmeChallengesNginxSnippet: AcmeChallengesNginxSnippet, AcmeRootCert: AcmeRootCert, AcmeUser: AcmeUser, Cert: Cert, CertChain: CertChain, Cron: Cron, Csr: Csr, DefaultServer: DefaultServer, Dir: Dir, File: File, GitCheckout: GitCheckout<'a, PathBuf>, Key: Key, KeyAndCertBundle: KeyAndCertBundle, LoadedDirectory: LoadedDirectory, MariaDbDatabase: MariaDbDatabase, MariaDbUser: MariaDbUser, SystemdSocketService: SystemdSocketService, NpmInstall: NpmInstall, Owner: Owner, PhpFpmPool: PhpFpmPool, ServeCustom: ServeCustom, ServeService: ServeService, ServePhp: ServePhp, ServeRedir: ServeRedir, ServeStatic: ServeStatic, StoredDirectory: StoredDirectory, User: User, UserForDomain: UserForDomain, WordpressPlugin: WordpressPlugin, WordpressTranslation: WordpressTranslation, );