diff --git a/src/artifacts/mod.rs b/src/artifacts/mod.rs index 20ed4fa..74c21c7 100644 --- a/src/artifacts/mod.rs +++ b/src/artifacts/mod.rs @@ -1,13 +1,24 @@ -use std::path::{Path as ActualPath, PathBuf}; +use std::path::{self, PathBuf}; +use std::rc::Rc; #[derive(Clone, Debug)] -pub struct Path(PathBuf); +pub struct Path(Rc); -// FIXME: This is a specialization since with Path: Into +impl Path { + pub(crate) fn clone_rc(&self) -> Rc { + Rc::clone(&self.0) + } + + pub fn join(&self, path: impl AsRef) -> Self { + Self::from(self.0.join(path)) + } +} + +// FIXME: This is a specialization since with Path: AsRef // it would overwrite impl From for T -//impl> From for Path { +//impl> From for Path { // fn from(v: T) -> Self { -// Path(v.into()) +// Self(v.as_ref().into()) // } //} @@ -15,7 +26,8 @@ macro_rules! path_from { ( $t:ty ) => { impl From<$t> for Path { fn from(v: $t) -> Self { - Self(v.into()) + let path: &path::Path = v.as_ref(); + Self(path.into()) } } }; @@ -25,23 +37,35 @@ path_from!(String); path_from!(&str); path_from!(PathBuf); -impl From for PathBuf { +impl From> for Path { + fn from(v: Rc) -> Self { + Self(v) + } +} + +impl AsRef for Path { + fn as_ref(&self) -> &path::Path { + &self.0 + } +} + +impl From for Rc { fn from(v: Path) -> Self { v.0 } } -impl AsRef for Path { - fn as_ref(&self) -> &ActualPath { - &self.0 +impl From<&Path> for Rc { + fn from(v: &Path) -> Self { + v.0.clone() } } #[derive(Clone, Debug)] -pub struct UserName(pub String); +pub struct UserName(pub Rc); #[derive(Clone, Debug)] -pub struct ServiceName(pub String); +pub struct ServiceName(pub Rc); #[derive(Clone, Debug)] -pub struct DatabaseName(pub String); +pub struct DatabaseName(pub Rc); diff --git a/src/bin.rs b/src/bin.rs index 91b66e9..3618616 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -2,7 +2,7 @@ use std::env; use std::process::exit; pub fn schematics_main(run: &dyn Fn(bool) -> Result<(), ()>) { - let args: Vec = env::args().collect(); + let args: Box<[String]> = env::args().collect(); let dry_run = match args.len() { 1 => false, 2 => { diff --git a/src/build.rs b/src/build.rs index 772339c..3ba1ccc 100644 --- a/src/build.rs +++ b/src/build.rs @@ -15,7 +15,8 @@ pub fn create_static_output( .to_str() .ok_or("Filename is not valid unicode")? .to_uppercase(); - let content = String::from_utf8(read_file(source_path)?)?; + let file = read_file(source_path)?; + let content = std::str::from_utf8(&file)?; let fence = content.chars().filter(|&c| c == '#').collect::() + "#"; writeln!( diff --git a/src/builder.rs b/src/builder.rs index 394d3d1..3230844 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -41,7 +41,8 @@ use crate::templates::systemd::{ }; use crate::to_artifact::ToArtifact; use std::fmt::Display; -use std::path::{Path, PathBuf}; +use std::path::Path; +use std::rc::Rc; pub trait ImplementationBuilder { type Prerequisites: ToArtifact; @@ -64,13 +65,13 @@ impl ImplementationBuilder> for DefaultBuilder { type Prerequisites = (); fn prerequisites(_resource: &Key) -> Self::Prerequisites {} - type Implementation = KeySymbol; + type Implementation = KeySymbol>; fn create( _resource: &Key, target: & as Resource>::Artifact, (): ::Artifact, ) -> Self::Implementation { - KeySymbol::new(StdCommandRunner, target.clone().into()) + KeySymbol::new(StdCommandRunner, target.clone_rc()) } } @@ -80,7 +81,7 @@ impl ImplementationBuilder> for DefaultBuilder { Key(resource.0.clone()) } - type Implementation = CsrSymbol; + type Implementation = CsrSymbol, Rc>; fn create( resource: &Csr, target: & as Resource>::Artifact, @@ -89,8 +90,8 @@ impl ImplementationBuilder> for DefaultBuilder { CsrSymbol::new( StdCommandRunner, resource.0.clone(), - key.into(), - target.clone().into(), + key.clone_rc(), + target.clone_rc(), ) } } @@ -116,7 +117,7 @@ impl ImplementationBuilder> for DefaultBuilder { } type Implementation = - CertSymbol, SetuidCommandRunner, D, PathBuf>; + CertSymbol>, SetuidCommandRunner>, D, Rc>; fn create( resource: &Cert, target: & as Resource>::Artifact, @@ -125,11 +126,11 @@ impl ImplementationBuilder> for DefaultBuilder { CertSymbol::new( resource.0.clone(), SetuidCommandRunner::new(user_name.0), - root_cert.into(), - account_key.into(), - challenges_dir.into(), - csr.into(), - target.clone().into(), + root_cert.clone_rc(), + account_key.clone_rc(), + challenges_dir.clone_rc(), + csr.clone_rc(), + target.clone_rc(), ) } } @@ -140,13 +141,13 @@ impl ImplementationBuilder> for DefaultBuilder { (Cert(resource.0.clone()), AcmeRootCert) } - type Implementation = ConcatSymbol<[PathBuf; 2], PathBuf, PathBuf>; + type Implementation = ConcatSymbol<[Rc; 2], Rc, Rc>; fn create( _resource: &CertChain, target: & as Resource>::Artifact, (cert, root_cert): ::Artifact, ) -> Self::Implementation { - ConcatSymbol::new([cert.into(), root_cert.into()], target.clone().into()) + ConcatSymbol::new([cert.clone_rc(), root_cert.clone_rc()], target.clone_rc()) } } @@ -156,13 +157,13 @@ impl ImplementationBuilder> for DefaultBuilder { (CertChain(resource.0.clone()), Key(resource.0.clone())) } - type Implementation = ConcatSymbol<[PathBuf; 2], PathBuf, PathBuf>; + type Implementation = ConcatSymbol<[Rc; 2], Rc, Rc>; fn create( _resource: &KeyAndCertBundle, target: & as Resource>::Artifact, (cert_chain, key): ::Artifact, ) -> Self::Implementation { - ConcatSymbol::new([key.into(), cert_chain.into()], target.clone().into()) + ConcatSymbol::new([key.clone_rc(), cert_chain.clone_rc()], target.clone_rc()) } } @@ -170,7 +171,7 @@ impl + Clone> ImplementationBuilder> for DefaultBuilder { type Prerequisites = (); fn prerequisites(_resource: &File

) -> Self::Prerequisites {} - type Implementation = FileSymbol; + type Implementation = FileSymbol>; fn create( resource: &File

, _target: & as Resource>::Artifact, @@ -201,7 +202,7 @@ impl ImplementationBuilder for DefaultBuilder { } type Implementation = ( - FileSymbol, + FileSymbol, Box>, ReloadServiceSymbol, ); fn create( @@ -211,8 +212,8 @@ impl ImplementationBuilder for DefaultBuilder { ) -> Self::Implementation { ( FileSymbol::new( - target.clone().into(), - nginx::default_server(challenges_snippet_path), + target.clone_rc(), + nginx::default_server(challenges_snippet_path).into(), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ) @@ -230,7 +231,7 @@ impl + Clone + Display> ImplementationBuilder> for } type Implementation = ( - FileSymbol, + FileSymbol, Box>, ReloadServiceSymbol, ); fn create( @@ -240,8 +241,8 @@ impl + Clone + Display> ImplementationBuilder> for ) -> Self::Implementation { ( FileSymbol::new( - target.clone().into(), - nginx::server_config(&resource.0, cert, key, &resource.1, challenges_snippet_path), + target.clone_rc(), + nginx::server_config(&resource.0, cert, key, &resource.1, challenges_snippet_path).into(), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ) @@ -267,7 +268,7 @@ impl, C: Clone + Into> } type Implementation = ( - FileSymbol, + FileSymbol, Box>, ReloadServiceSymbol, ); fn create( @@ -277,14 +278,15 @@ impl, C: Clone + Into> ) -> Self::Implementation { ( FileSymbol::new( - target.clone().into(), + target.clone_rc(), nginx::server_config( &resource.0, cert, key, nginx::php_snippet(resource.2, pool.0, &resource.1) + &resource.3, challenges_snippet_path, - ), + ) + .into(), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ) @@ -316,7 +318,7 @@ impl> ImplementationBuilder, + FileSymbol, Box>, ReloadServiceSymbol, ); fn create( @@ -326,14 +328,15 @@ impl> ImplementationBuilder Self::Implementation { ( FileSymbol::new( - target.clone().into(), + target.clone_rc(), nginx::server_config( &resource.0, cert, key, nginx::proxy_snippet(&socket.0, &resource.3), challenges_snippet_path, - ), + ) + .into(), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ) @@ -351,7 +354,7 @@ impl + Clone + Display> ImplementationBuilder> for D } type Implementation = ( - FileSymbol, + FileSymbol, Box>, ReloadServiceSymbol, ); fn create( @@ -361,14 +364,15 @@ impl + Clone + Display> ImplementationBuilder> for D ) -> Self::Implementation { ( FileSymbol::new( - target.clone().into(), + target.clone_rc(), nginx::server_config( &resource.0, cert, key, nginx::redir_snippet(resource.1.as_ref()), challenges_snippet_path, - ), + ) + .into(), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ) @@ -388,7 +392,7 @@ impl + Clone + Display, P: AsRef> ImplementationBuilder, + FileSymbol, Box>, ReloadServiceSymbol, ); fn create( @@ -398,14 +402,15 @@ impl + Clone + Display, P: AsRef> ImplementationBuilder Self::Implementation { ( FileSymbol::new( - target.clone().into(), + target.clone_rc(), nginx::server_config( &resource.0, cert, key, nginx::static_snippet(resource.1.as_ref()), challenges_snippet_path, - ), + ) + .into(), ), ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ) @@ -417,8 +422,8 @@ impl ImplementationBuilder> for DefaultBuilder { fn prerequisites(_resource: &PhpFpmPool) -> Self::Prerequisites {} type Implementation = ( - FileSymbol, - ReloadServiceSymbol, + FileSymbol, Box>, + ReloadServiceSymbol>, ); fn create( resource: &PhpFpmPool, @@ -427,8 +432,8 @@ impl ImplementationBuilder> for DefaultBuilder { ) -> Self::Implementation { ( FileSymbol::new( - conf_path.clone().into(), - php_fpm_pool_config(&user_name.0, socket_path, &resource.1), + conf_path.clone_rc(), + php_fpm_pool_config(&user_name.0, socket_path, &resource.1).into(), ), ReloadServiceSymbol::new(StdCommandRunner, service_name.0.clone()), ) @@ -441,10 +446,10 @@ impl> ImplementationBuilder> for De type Implementation = ( // First three could be parallel - FileSymbol, - SystemdUserSessionSymbol<'static, String, StdCommandRunner>, - OwnerSymbol, - UserServiceSymbol<'static, PathBuf, String>, + FileSymbol, Box>, + SystemdUserSessionSymbol<'static, Rc, StdCommandRunner>, + OwnerSymbol, Rc>, + UserServiceSymbol<'static, Rc, Rc>, ); fn create( resource: &SystemdSocketService, @@ -453,7 +458,7 @@ impl> ImplementationBuilder> for De ) -> Self::Implementation { ( FileSymbol::new( - conf_path.clone().into(), + conf_path.clone_rc(), if resource.4 { systemd_nodejs_service(&resource.2, socket_path, &resource.3) } else { @@ -463,15 +468,16 @@ impl> ImplementationBuilder> for De &resource.3, "", ) - }, + } + .into(), ), SystemdUserSessionSymbol::new(user_name.0.clone(), &StdCommandRunner), OwnerSymbol::new( - conf_path.as_ref().parent().unwrap().to_path_buf(), + conf_path.as_ref().parent().unwrap().into(), user_name.0.clone(), StdCommandRunner, ), - UserServiceSymbol::new(socket_path.clone().into(), user_name.0.clone(), resource.1), + UserServiceSymbol::new(socket_path.clone_rc(), user_name.0.clone(), resource.1), ) } } @@ -516,7 +522,7 @@ impl> ImplementationBuilder> for Defau ) -> Self::Implementation { SavedDirectorySymbol::new( resource.1.clone(), - SimpleStorage::new(target.clone().into()), + SimpleStorage::new(target.clone_rc()), StorageDirection::Store, StdCommandRunner, ) @@ -535,7 +541,7 @@ impl> ImplementationBuilder> for Defau ) -> Self::Implementation { SavedDirectorySymbol::new( resource.1.clone(), - SimpleStorage::new(target.clone().into()), + SimpleStorage::new(target.clone_rc()), StorageDirection::Load, StdCommandRunner, ) @@ -546,7 +552,7 @@ impl ImplementationBuilder> for DefaultBuilder { type Prerequisites = (); fn prerequisites(_resource: &UserForDomain) -> Self::Prerequisites {} - type Implementation = UserSymbol; + type Implementation = UserSymbol, StdCommandRunner>; fn create( _resource: &UserForDomain, (user_name, _home_path): & as Resource>::Artifact, @@ -560,7 +566,7 @@ impl ImplementationBuilder for DefaultBuilder { type Prerequisites = (); fn prerequisites(_resource: &User) -> Self::Prerequisites {} - type Implementation = UserSymbol; + type Implementation = UserSymbol, StdCommandRunner>; fn create( resource: &User, (): &::Artifact, @@ -574,7 +580,7 @@ impl + Clone> ImplementationBuilder> for DefaultBuilder type Prerequisites = (); fn prerequisites(_resource: &Owner

) -> Self::Prerequisites {} - type Implementation = OwnerSymbol; + type Implementation = OwnerSymbol>; fn create( resource: &Owner

, (): & as Resource>::Artifact, @@ -588,7 +594,7 @@ impl ImplementationBuilder for DefaultBuilder { type Prerequisites = (); fn prerequisites(_resource: &AcmeUser) -> Self::Prerequisites {} - type Implementation = UserSymbol; + type Implementation = UserSymbol, StdCommandRunner>; fn create( _resource: &AcmeUser, user_name: &::Artifact, @@ -605,8 +611,8 @@ impl ImplementationBuilder for DefaultBuilder { } type Implementation = ( - DirSymbol, - OwnerSymbol, + DirSymbol>, + OwnerSymbol, Rc>, ); fn create( _resource: &AcmeChallengesDir, @@ -614,8 +620,8 @@ impl ImplementationBuilder for DefaultBuilder { user_name: ::Artifact, ) -> Self::Implementation { ( - DirSymbol::new(target.clone().into()), - OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner), + DirSymbol::new(target.clone_rc()), + OwnerSymbol::new(target.clone_rc(), user_name.0, StdCommandRunner), ) } } @@ -626,15 +632,15 @@ impl ImplementationBuilder for DefaultBuilder { AcmeChallengesDir } - type Implementation = FileSymbol; + type Implementation = FileSymbol, Box>; fn create( _resource: &AcmeChallengesNginxSnippet, target: &::Artifact, challenges_dir: ::Artifact, ) -> Self::Implementation { FileSymbol::new( - target.clone().into(), - nginx::acme_challenges_snippet(challenges_dir), + target.clone_rc(), + nginx::acme_challenges_snippet(challenges_dir).into(), ) } } @@ -646,8 +652,8 @@ impl ImplementationBuilder for DefaultBuilder { } type Implementation = ( - KeySymbol, - OwnerSymbol, + KeySymbol>, + OwnerSymbol, Rc>, ); fn create( _resource: &AcmeAccountKey, @@ -655,8 +661,8 @@ impl ImplementationBuilder for DefaultBuilder { user_name: ::Artifact, ) -> Self::Implementation { ( - KeySymbol::new(StdCommandRunner, target.clone().into()), - OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner), + KeySymbol::new(StdCommandRunner, target.clone_rc()), + OwnerSymbol::new(target.clone_rc(), user_name.0, StdCommandRunner), ) } } @@ -665,13 +671,13 @@ impl ImplementationBuilder for DefaultBuilder { type Prerequisites = (); fn prerequisites(_resource: &AcmeRootCert) -> Self::Prerequisites {} - type Implementation = FileSymbol; + type Implementation = FileSymbol, &'static str>; fn create( _resource: &AcmeRootCert, target: &::Artifact, (): ::Artifact, ) -> Self::Implementation { - FileSymbol::new(target.clone().into(), LETS_ENCRYPT_R3) + FileSymbol::new(target.clone_rc(), LETS_ENCRYPT_R3) } } @@ -679,7 +685,7 @@ impl ImplementationBuilder> for DefaultBuilder { type Prerequisites = (); fn prerequisites(_resource: &MariaDbUser) -> Self::Prerequisites {} - type Implementation = MariaDbUserSymbol<'static, String, StdCommandRunner>; + type Implementation = MariaDbUserSymbol<'static, Rc, StdCommandRunner>; fn create( _resource: &MariaDbUser, user_name: & as Resource>::Artifact, @@ -696,15 +702,15 @@ impl ImplementationBuilder> for DefaultBuilder { } type Implementation = ( - MariaDbDatabaseSymbol<'static, String, SimpleStorage, StdCommandRunner>, - MariaDbDumpSymbol<'static, String, StdCommandRunner, SimpleStorage>, + MariaDbDatabaseSymbol<'static, Rc, SimpleStorage, StdCommandRunner>, + MariaDbDumpSymbol<'static, Rc, StdCommandRunner, SimpleStorage>, ); fn create( _resource: &MariaDbDatabase, (db_name, _, data_path): & as Resource>::Artifact, _: ::Artifact, ) -> Self::Implementation { - let db_dump = SimpleStorage::new(data_path.clone().into()); + let db_dump = SimpleStorage::new(data_path.clone_rc()); ( MariaDbDatabaseSymbol::new(db_name.0.clone(), db_dump.clone(), &StdCommandRunner), MariaDbDumpSymbol::new(db_name.0.clone(), db_dump, &StdCommandRunner), @@ -716,13 +722,13 @@ impl ImplementationBuilder> for DefaultBuilder { type Prerequisites = (); fn prerequisites(_: &PostgresqlDatabase) -> Self::Prerequisites {} - type Implementation = (PostgreSQLDatabaseSymbol<'static, String, String, StdCommandRunner>,); + type Implementation = (PostgreSQLDatabaseSymbol<'static, Rc, Rc, StdCommandRunner>,); fn create( _resource: &PostgresqlDatabase, (db_name, data_path): & as Resource>::Artifact, _: ::Artifact, ) -> Self::Implementation { - let db_dump = SimpleStorage::new(data_path.clone().into()); + let db_dump = SimpleStorage::new(data_path.clone_rc()); (PostgreSQLDatabaseSymbol::new( db_name.0.clone(), db_dump.read_filename().unwrap().to_str().unwrap().into(), @@ -732,9 +738,9 @@ impl ImplementationBuilder> for DefaultBuilder { } impl> ImplementationBuilder> for DefaultBuilder { - type Prerequisites = Dir; + type Prerequisites = Dir>; fn prerequisites(resource: &WordpressPlugin

) -> Self::Prerequisites { - Dir(resource.0.as_ref().join("wp-content/plugins")) + Dir::new(resource.0.as_ref().join("wp-content/plugins")) } type Implementation = WordpressPluginSymbol<'static, P, &'static str, StdCommandRunner>; @@ -747,21 +753,21 @@ impl> ImplementationBuilder> for Defau } } -impl> ImplementationBuilder> for DefaultBuilder { - type Prerequisites = Dir; +impl> ImplementationBuilder> for DefaultBuilder { + type Prerequisites = Dir>; fn prerequisites(resource: &WordpressTranslation

) -> Self::Prerequisites { - Dir(resource.0.as_ref().join("wp-content/languages")) + Dir::new(resource.0.as_ref().join("wp-content/languages")) } type Implementation = - WordpressTranslationSymbol<'static, &'static str, PathBuf, StdCommandRunner>; + WordpressTranslationSymbol<'static, &'static str, Box, StdCommandRunner>; fn create( resource: &WordpressTranslation

, (): & as Resource>::Artifact, _: ::Artifact, ) -> Self::Implementation { WordpressTranslationSymbol::new( - resource.0.as_ref().join("wp-content/languages"), + (*resource.0.as_ref().join("wp-content/languages")).into(), resource.1, resource.2, &StdCommandRunner, @@ -775,7 +781,7 @@ impl ImplementationBuilder> for DefaultBuilder { UserForDomain(resource.0.clone()) } - type Implementation = CronSymbol<'static, String, String, StdCommandRunner>; + type Implementation = CronSymbol<'static, Box, Rc, StdCommandRunner>; fn create( resource: &Cron, (): & as Resource>::Artifact, diff --git a/src/command_runner.rs b/src/command_runner.rs index 70418d8..ec10437 100644 --- a/src/command_runner.rs +++ b/src/command_runner.rs @@ -19,7 +19,7 @@ fn check_success(output: Output) -> Result> { if output.status.success() { Ok(output) } else { - Err(String::from_utf8(output.stderr)?.into()) + Err(std::str::from_utf8(&output.stderr)?.into()) } } @@ -93,7 +93,7 @@ struct TempSetEnv<'a> { } impl<'a> TempSetEnv<'a> { - fn new(name: &'a str, new_value: String) -> TempSetEnv<'a> { + fn new(name: &'a str, new_value: impl AsRef) -> TempSetEnv<'a> { let old_value = env::var(name); env::set_var(name, new_value); TempSetEnv { diff --git a/src/locator.rs b/src/locator.rs index 3322baa..2591253 100644 --- a/src/locator.rs +++ b/src/locator.rs @@ -12,7 +12,8 @@ use crate::resources::{ use crate::to_artifact::ToArtifact; use std::fmt::Display; use std::marker::PhantomData; -use std::path::{Path, PathBuf}; +use std::path::Path; +use std::rc::Rc; pub trait Policy { #[must_use] @@ -21,13 +22,13 @@ pub trait Policy { } #[must_use] - fn user_home(user_name: &str) -> PathBuf { - Path::new("/home").join(user_name) + fn user_home(user_name: &str) -> Rc { + Path::new("/home").join(user_name).into() } #[must_use] - fn user_name_for_domain(domain_name: &'_ str) -> String { - domain_name.split('.').rev().fold(String::new(), |result, part| if result.is_empty() { result } else { result + "_" } + part) + fn user_name_for_domain(domain_name: &'_ str) -> Rc { + domain_name.split('.').rev().fold(String::new(), |result, part| if result.is_empty() { result } else { result + "_" } + part).into() } #[must_use] @@ -36,8 +37,8 @@ pub trait Policy { } #[must_use] - fn path_for_data(name: impl Display) -> PathBuf { - Path::new("/root/data").join(format!("_{name}")) + fn path_for_data(name: impl Display) -> Rc { + Path::new("/root/data").join(format!("_{name}")).into() } } @@ -59,37 +60,37 @@ pub struct DefaultLocator

{ } impl> ResourceLocator> for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate(resource: &Key) -> ( as Resource>::Artifact, Self::Prerequisites) { ( PathArtifact::from(format!("/etc/ssl/private/{}.key", resource.0.as_ref())), - Dir("/etc/ssl/private".into()), + Dir::new("/etc/ssl/private"), ) } } impl> ResourceLocator> for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate(resource: &Csr) -> ( as Resource>::Artifact, Self::Prerequisites) { ( PathArtifact::from(format!("/etc/ssl/local_certs/{}.csr", resource.0.as_ref())), - Dir("/etc/ssl/local_certs".into()), + Dir::new("/etc/ssl/local_certs"), ) } } impl> ResourceLocator> for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate(resource: &Cert) -> ( as Resource>::Artifact, Self::Prerequisites) { ( PathArtifact::from(format!("/etc/ssl/local_certs/{}.crt", resource.0.as_ref())), - Dir("/etc/ssl/local_certs".into()), + Dir::new("/etc/ssl/local_certs"), ) } } impl> ResourceLocator> for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( resource: &CertChain, ) -> ( as Resource>::Artifact, Self::Prerequisites) { @@ -98,13 +99,13 @@ impl> ResourceLocator> for DefaultLocator

{ "/etc/ssl/local_certs/{}.chained.crt", resource.0.as_ref() )), - Dir("/etc/ssl/local_certs".into()), + Dir::new("/etc/ssl/local_certs"), ) } } impl> ResourceLocator> for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( resource: &KeyAndCertBundle, ) -> ( @@ -116,34 +117,34 @@ impl> ResourceLocator> for DefaultLocator

> ResourceLocator> for DefaultLocator { - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate(resource: &File

) -> ( as Resource>::Artifact, Self::Prerequisites) { - ((), Dir(resource.0.as_ref().parent().unwrap().into())) + ((), Dir::new(resource.0.as_ref().parent().unwrap())) } } impl<'a, POLICY, P: AsRef> ResourceLocator> for DefaultLocator { - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( resource: &GitCheckout<'a, P>, ) -> ( as Resource>::Artifact, Self::Prerequisites, ) { - ((), Dir(resource.0.as_ref().parent().unwrap().into())) + ((), Dir::new(resource.0.as_ref().parent().unwrap())) } } impl> ResourceLocator> for DefaultLocator { - type Prerequisites = Option>; + type Prerequisites = Option>>; fn locate(resource: &Dir

) -> ( as Resource>::Artifact, Self::Prerequisites) { - ((), resource.0.as_ref().parent().map(|p| Dir(p.into()))) + ((), resource.0.as_ref().parent().map(Dir::new)) } } @@ -173,7 +174,7 @@ impl> ResourceLocator> impl> ResourceLocator> for DefaultLocator { - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( resource: &LoadedDirectory

, ) -> ( @@ -182,13 +183,13 @@ impl> ResourceLocator> ) { ( PathArtifact::from(POLICY::path_for_data(resource.0)), - Dir(resource.1.as_ref().parent().unwrap().into()), + Dir::new(resource.1.as_ref().parent().unwrap()), ) } } impl ResourceLocator for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( _resource: &AcmeAccountKey, ) -> (::Artifact, Self::Prerequisites) { @@ -207,7 +208,7 @@ impl ResourceLocator for DefaultLocator

{ } impl ResourceLocator for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( _resource: &AcmeChallengesDir, ) -> ( @@ -236,7 +237,7 @@ impl ResourceLocator for DefaultLocator

ResourceLocator for DefaultLocator

{ - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( _resource: &AcmeRootCert, ) -> (::Artifact, Self::Prerequisites) { @@ -370,7 +371,7 @@ impl, P: Policy> ResourceLocator> for Defaul php_version, user.0 )), user, - ServiceNameArtifact(format!("php{php_version}-fpm")), + ServiceNameArtifact(format!("php{php_version}-fpm").into()), ), (), ) @@ -380,7 +381,7 @@ impl, P: Policy> ResourceLocator> for Defaul impl, P, POLICY: Policy> ResourceLocator> for DefaultLocator { - type Prerequisites = Dir; + type Prerequisites = Dir>; fn locate( resource: &SystemdSocketService, ) -> ( @@ -396,7 +397,7 @@ impl, P, POLICY: Policy> ResourceLocator Resource for KeyAndCertBundle { } #[derive(Debug, Hash, PartialEq, Eq)] -pub struct File

(pub P, pub String); +pub struct File

(pub P, pub Rc); impl

Resource for File

{ type Artifact = (); } +impl File> { + pub fn new(p: impl Into>, content: impl AsRef) -> Self { + Self(p.into(), content.as_ref().into()) + } +} + #[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 = (); } +impl<'a> GitCheckout<'a, Rc> { + pub fn new(target: impl Into>, src: &'a str, head: &'a str) -> Self { + Self(target.into(), src, head) + } +} + #[derive(Debug, Hash, PartialEq, Eq)] pub struct Dir

(pub P); impl

Resource for Dir

{ type Artifact = (); } +impl Dir> { + pub fn new(p: impl AsRef) -> Self { + Self(p.as_ref().into()) + } +} + #[derive(Debug, Hash, PartialEq, Eq)] pub struct UserForDomain(pub D); impl Resource for UserForDomain { @@ -106,10 +124,11 @@ impl

Resource for LoadedDirectory

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

, LoadedDirectory

) { + target: impl Into>, +) -> (StoredDirectory>, LoadedDirectory>) { + let target = target.into(); ( StoredDirectory(storage_name, target.clone()), LoadedDirectory(storage_name, target), @@ -117,7 +136,7 @@ pub fn get_saved_directory( } #[derive(Debug, Hash, PartialEq, Eq)] -pub struct User(pub String); +pub struct User(pub Rc); impl Resource for User { type Artifact = (); } @@ -134,20 +153,32 @@ impl

Resource for NpmInstall

{ type Artifact = (); } +impl NpmInstall> { + pub fn new(path: impl Into>) -> Self { + Self(path.into()) + } +} + #[derive(Debug, Hash, PartialEq, Eq)] -pub struct Owner

(pub String, pub P); +pub struct Owner

(pub Rc, pub P); impl

Resource for Owner

{ type Artifact = (); } +impl Owner> { + pub fn new(user: &UserNameArtifact, p: impl Into>) -> Self { + Self(user.0.clone(), p.into()) + } +} + #[derive(Debug, Hash, PartialEq, Eq)] -pub struct ServeCustom(pub D, pub String); +pub struct ServeCustom(pub D, pub Rc); 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 C); +pub struct ServePhp(pub D, pub P, pub &'static str, pub Rc, pub C); impl Resource for ServePhp { type Artifact = PathArtifact; } @@ -158,6 +189,25 @@ pub struct ServeService(pub D, pub &'static str, pub P, pub P, pub P, pub impl Resource for ServeService { type Artifact = PathArtifact; } +impl ServeService> { + pub fn new( + domain: D, + service_name: &'static str, + exec: impl Into>, + static_path: impl Into>, + working_directory: impl Into>, + is_nodejs: bool, + ) -> Self { + Self( + domain, + service_name, + exec.into(), + static_path.into(), + working_directory.into(), + is_nodejs, + ) + } +} #[derive(Debug, Hash, PartialEq, Eq)] pub struct ServeRedir(pub D, pub D); @@ -171,6 +221,12 @@ impl Resource for ServeStatic { type Artifact = PathArtifact; } +impl ServeStatic> { + pub fn new(domain: D, path: impl Into>) -> Self { + Self(domain, path.into()) + } +} + #[derive(Debug, Hash, PartialEq, Eq)] pub struct DefaultServer; impl Resource for DefaultServer { @@ -213,14 +269,26 @@ impl

Resource for WordpressPlugin

{ type Artifact = (); } +impl WordpressPlugin> { + pub fn new(path: impl Into>, name: &'static str) -> Self { + Self(path.into(), name) + } +} + #[derive(Debug, Hash, PartialEq, Eq)] pub struct WordpressTranslation

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

Resource for WordpressTranslation

{ type Artifact = (); } +impl WordpressTranslation> { + pub fn new(path: impl Into>, version: &'static str, lang: &'static str) -> Self { + Self(path.into(), version, lang) + } +} + #[derive(Debug, Hash, PartialEq, Eq)] -pub struct Cron(pub D, pub String); +pub struct Cron(pub D, pub Rc); impl Resource for Cron { type Artifact = (); } @@ -287,38 +355,38 @@ default_resources!( Cron: Cron, Csr: Csr, DefaultServer: DefaultServer, - Dir: Dir, - File: File, - GitCheckout: GitCheckout<'a, PathBuf>, + Dir: Dir>, + File: File>, + GitCheckout: GitCheckout<'a, Rc>, Key: Key, KeyAndCertBundle: KeyAndCertBundle, - LoadedDirectory: LoadedDirectory, + LoadedDirectory: LoadedDirectory>, MariaDbDatabase: MariaDbDatabase, MariaDbUser: MariaDbUser, PostgresqlDatabase: PostgresqlDatabase, - SystemdSocketService: SystemdSocketService, - NpmInstall: NpmInstall, - Owner: Owner, + SystemdSocketService: SystemdSocketService>, + NpmInstall: NpmInstall>, + Owner: Owner>, PhpFpmPool: PhpFpmPool, ServeCustom: ServeCustom, - ServeService: ServeService, - ServePhp: ServePhp, + ServeService: ServeService>, + ServePhp: ServePhp, FpmPoolConfig>, ServeRedir: ServeRedir, - ServeStatic: ServeStatic, - StoredDirectory: StoredDirectory, + ServeStatic: ServeStatic>, + StoredDirectory: StoredDirectory>, User: User, UserForDomain: UserForDomain, - WordpressPlugin: WordpressPlugin, - WordpressTranslation: WordpressTranslation, + WordpressPlugin: WordpressPlugin>, + WordpressTranslation: WordpressTranslation>, ); -pub fn serve_php, C: Into>( +pub fn serve_php>( domain: D, - path: P, + path: impl Into>, root_filename: &'static str, - nginx_config: impl Into, + nginx_config: impl Into>, pool_config: C, -) -> ServePhp { +) -> ServePhp, FpmPoolConfig> { ServePhp( domain, path.into(), diff --git a/src/storage.rs b/src/storage.rs index aa4ce9d..61609bd 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -1,49 +1,46 @@ use std::error::Error; use std::fs::read_dir; -use std::path::PathBuf; +use std::path::Path; +use std::rc::Rc; use std::str::FromStr; use std::time::{SystemTime, UNIX_EPOCH}; pub trait Storage { - fn write_filename(&self) -> PathBuf; - fn read_filename(&self) -> Result>; + fn write_filename(&self) -> Box; + fn read_filename(&self) -> Result, Box>; fn recent_date(&self) -> Result>; } #[derive(Debug, Clone)] -pub struct SimpleStorage(PathBuf); +pub struct SimpleStorage(Rc); impl SimpleStorage { #[must_use] - pub const fn new(base: PathBuf) -> Self { + pub const fn new(base: Rc) -> Self { Self(base) } - fn get_path(&self, date: Option) -> PathBuf { - match date { - Some(d) => self.0.join(d.to_string()), - None => self.0.clone(), - } + fn get_path(&self, date: u64) -> Box { + self.0.join(date.to_string()).into() } } impl Storage for SimpleStorage { - fn write_filename(&self) -> PathBuf { - self.get_path(Some( + fn write_filename(&self) -> Box { + self.get_path( SystemTime::now() .duration_since(UNIX_EPOCH) .unwrap() .as_secs(), - )) + ) } - fn read_filename(&self) -> Result> { - Ok(self.get_path(Some(self.recent_date()?))) + fn read_filename(&self) -> Result, Box> { + Ok(self.get_path(self.recent_date()?)) } fn recent_date(&self) -> Result> { - let dir = self.get_path(None); - read_dir(dir)? + read_dir(&self.0)? .map(|entry| { entry .ok() diff --git a/src/symbols/acme/cert.rs b/src/symbols/acme/cert.rs index e54f70a..9055c85 100644 --- a/src/symbols/acme/cert.rs +++ b/src/symbols/acme/cert.rs @@ -102,7 +102,7 @@ impl<_C: CommandRunner, C: Borrow<_C>, D: AsRef, P: AsRef> Symbol for { Ok(false) } else { - Err(String::from_utf8(output.stderr)?.into()) + Err(std::str::from_utf8(&output.stderr)?.into()) } } diff --git a/src/symbols/cron.rs b/src/symbols/cron.rs index 45571ed..c0d7008 100644 --- a/src/symbols/cron.rs +++ b/src/symbols/cron.rs @@ -10,11 +10,11 @@ pub struct Cron<'r, C, U, R> { command_runner: &'r R, } -impl<'r, U, R> Cron<'r, String, U, R> { +impl<'r, U, R> Cron<'r, Box, U, R> { pub fn new>(user: U, content: C, command_runner: &'r R) -> Self { Self { user, - content: String::from(content.as_ref()) + "\n", + content: (String::from(content.as_ref()) + "\n").into(), command_runner, } } diff --git a/src/symbols/git/submodules.rs b/src/symbols/git/submodules.rs index 5413b8d..ec3fd6d 100644 --- a/src/symbols/git/submodules.rs +++ b/src/symbols/git/submodules.rs @@ -42,15 +42,14 @@ impl, C: CommandRunner> Symbol for GitSubmodules<'_, P, C> { if !self.target.as_ref().exists() { return Ok(false); } - let output = String::from_utf8( - self - ._run_in_target_repo(args!["submodule", "status"]) - .await?, - )?; Ok( - output - .lines() - .all(|line| line.is_empty() || line.starts_with(' ')), + std::str::from_utf8( + &self + ._run_in_target_repo(args!["submodule", "status"]) + .await?, + )? + .lines() + .all(|line| line.is_empty() || line.starts_with(' ')), ) } diff --git a/src/symbols/npm.rs b/src/symbols/npm.rs index d2118cf..59ca7dc 100644 --- a/src/symbols/npm.rs +++ b/src/symbols/npm.rs @@ -51,7 +51,7 @@ impl, C: CommandRunner> Symbol for Install<'_, T, C> { .await?; Ok( result.status.success() - && !String::from_utf8(result.stdout) + && !std::str::from_utf8(&result.stdout) .unwrap() .contains("(empty)"), ) diff --git a/src/symbols/saved_directory.rs b/src/symbols/saved_directory.rs index 6e45c89..50467d4 100644 --- a/src/symbols/saved_directory.rs +++ b/src/symbols/saved_directory.rs @@ -73,7 +73,7 @@ impl<_C: CommandRunner, C: Borrow<_C>, P: AsRef, S: Storage> Symbol ], ) .await?; - let modified_date = u64::from_str(String::from_utf8(output)?.trim_end())?; + let modified_date = u64::from_str(std::str::from_utf8(&output)?.trim_end())?; if if self.dir == StorageDirection::Store { modified_date > dump_date } else { @@ -84,13 +84,17 @@ impl<_C: CommandRunner, C: Borrow<_C>, P: AsRef, S: Storage> Symbol .borrow() .run_with_args( "diff", - args!["-rq", self.storage.read_filename()?, self.path.as_ref()], + args![ + "-rq", + self.storage.read_filename()?.as_os_str(), + self.path.as_ref() + ], ) .await?; match output.status.code() { Some(0) => Ok(true), Some(1) => Ok(false), - _ => Err(String::from_utf8(output.stderr)?.into()), + _ => Err(std::str::from_utf8(&output.stderr)?.into()), } } else { Ok(true) @@ -109,7 +113,11 @@ impl<_C: CommandRunner, C: Borrow<_C>, P: AsRef, S: Storage> Symbol .borrow() .run_successfully( "cp", - args!["-a", self.storage.read_filename()?, self.path.as_ref()], + args![ + "-a", + self.storage.read_filename()?.as_os_str(), + self.path.as_ref() + ], ) .await } else { @@ -118,7 +126,11 @@ impl<_C: CommandRunner, C: Borrow<_C>, P: AsRef, S: Storage> Symbol .borrow() .run_successfully( "cp", - args!["-a", self.path.as_ref(), self.storage.write_filename()], + args![ + "-a", + self.path.as_ref(), + self.storage.write_filename().as_os_str() + ], ) .await } diff --git a/src/symbols/systemd/user_service.rs b/src/symbols/systemd/user_service.rs index 67ed3b2..fef5692 100644 --- a/src/symbols/systemd/user_service.rs +++ b/src/symbols/systemd/user_service.rs @@ -30,9 +30,9 @@ impl, U: AsRef> UserService<'_, S, U> { loop { let result = self.command_runner.run_with_args("systemctl", args).await?; if result.status.success() { - return Ok(String::from_utf8(result.stdout)?.trim_end().to_string()); + return Ok(std::str::from_utf8(&result.stdout)?.trim_end().to_string()); } - let raw_stderr = String::from_utf8(result.stderr)?; + let raw_stderr = std::str::from_utf8(&result.stderr)?; let stderr = raw_stderr.trim_end(); if stderr != "Failed to connect to bus: No such file or directory" { return Err(stderr.into()); @@ -61,8 +61,8 @@ impl, U: AsRef> UserService<'_, S, U> { "ActiveState=active" => return Ok(true), "ActiveState=failed" => { return Err( - String::from_utf8( - self + std::str::from_utf8( + &self .command_runner .get_output( "journalctl", diff --git a/src/symbols/wordpress/plugin.rs b/src/symbols/wordpress/plugin.rs index 63f823a..514234a 100644 --- a/src/symbols/wordpress/plugin.rs +++ b/src/symbols/wordpress/plugin.rs @@ -6,7 +6,7 @@ use std::error::Error; use std::fs::File as FsFile; use std::io; use std::io::{BufRead, BufReader}; -use std::path::{Path, PathBuf}; +use std::path::Path; #[derive(Debug)] pub struct Plugin<'a, P, N, R> { @@ -24,12 +24,13 @@ impl<'a, P: AsRef, N: AsRef, R> Plugin<'a, P, N, R> { } } - fn get_path(&self) -> PathBuf { + fn get_path(&self) -> Box { self .base .as_ref() .join("wp-content/plugins") .join(self.name.as_ref()) + .into() } } @@ -41,8 +42,8 @@ impl, N: AsRef, R: CommandRunner> Symbol for Plugin<'_, P, N return Ok(false); } let path = base_path.join(self.name.as_ref().to_owned() + ".php"); - let mut version = String::new(); - let mut plugin_uri = String::new(); + let mut version: Option> = None; + let mut plugin_uri: Option> = None; match FsFile::open(path) { Err(e) => { // Check if file exists @@ -56,11 +57,12 @@ impl, N: AsRef, R: CommandRunner> Symbol for Plugin<'_, P, N let reader = BufReader::new(file); let regex = Regex::new("(?m)^(Plugin URI|Version): (.+)$")?; for content in reader.lines() { - for matches in regex.captures_iter(&(content?)) { + let content = content?; + for matches in regex.captures_iter(&content) { if &matches[1] == "Plugin URI" { - plugin_uri = matches[2].to_string(); + plugin_uri = Some(matches[2].into()); } else { - version = matches[2].to_string(); + version = Some(matches[2].into()); } } } @@ -75,14 +77,14 @@ impl, N: AsRef, R: CommandRunner> Symbol for Plugin<'_, P, N format!( r###"plugins={{"plugins":{{"{0}/{0}.php":{{"Version":"{1}", "PluginURI":"{2}"}}}}}}"###, self.name.as_ref(), - version, - plugin_uri + version.as_deref().unwrap_or_default(), + plugin_uri.as_deref().unwrap_or_default() ), "https://api.wordpress.org/plugins/update-check/1.1/", ], ) .await?; - Ok(String::from_utf8(upstream)?.contains(r###""plugins":[]"###)) + Ok(std::str::from_utf8(&upstream)?.contains(r###""plugins":[]"###)) } async fn execute(&self) -> Result<(), Box> { @@ -97,7 +99,7 @@ impl, N: AsRef, R: CommandRunner> Symbol for Plugin<'_, P, N .await?; self .command_runner - .run_successfully("rm", args!["-rf", self.get_path()]) + .run_successfully("rm", args!["-rf", self.get_path().as_os_str()]) .await?; self .command_runner diff --git a/src/symbols/wordpress/translation.rs b/src/symbols/wordpress/translation.rs index 0a41dac..3531f90 100644 --- a/src/symbols/wordpress/translation.rs +++ b/src/symbols/wordpress/translation.rs @@ -8,7 +8,6 @@ use std::fs::File as FsFile; use std::io; use std::io::{BufRead, BufReader}; use std::path::Path; -use std::path::PathBuf; #[derive(Debug)] pub struct Translation<'a, C, D, R> { @@ -30,7 +29,7 @@ impl<'a, D, C: AsRef, R> Translation<'a, C, D, R> { } impl, D: AsRef, R: CommandRunner> Translation<'_, C, D, R> { - fn get_pairs(&self) -> Vec<(String, PathBuf)> { + fn get_pairs(&self) -> impl Iterator, Box)> + '_ { let version_x = self .version .trim_end_matches(|c: char| c.is_ascii_digit()) @@ -42,21 +41,19 @@ impl, D: AsRef, R: CommandRunner> Translation<'_, C, D, R> { } else { locale.to_lowercase().replace('_', "-") }; - let mut res = vec![]; - for &(in_slug, out_slug) in &[ + [ ("", ""), ("cc/", "continents-cities-"), ("admin/", "admin-"), ("admin/network/", "admin-network-"), - ] { - for format in &["po", "mo"] { - res.push(( - format!("https://translate.wordpress.org/projects/wp/{version_x}/{in_slug}{path_locale}/default/export-translations?format={format}"), - [self.path.as_ref(), format!("{}{}.{}", out_slug, self.locale.as_ref(), format).as_ref()].iter().collect() - )); + ].into_iter().flat_map(move |(in_slug, out_slug)|{ + ["po", "mo"].map(|format| + ( + format!("https://translate.wordpress.org/projects/wp/{version_x}/{in_slug}{path_locale}/default/export-translations?format={format}").into(), + self.path.as_ref().join(format!("{}{}.{}", out_slug, self.locale.as_ref(), format)).into() + )) } - } - res + ) } } @@ -80,7 +77,7 @@ impl, D: AsRef, R: CommandRunner> Symbol for Translation<'_, let reader = BufReader::new(file); for content in reader.lines() { if let Some(match_result) = match_date.captures(&content?) { - newest = max(newest, match_result[1].to_string()); + newest = max(newest, match_result[1].into()); break; } } @@ -99,7 +96,7 @@ impl, D: AsRef, R: CommandRunner> Symbol for Translation<'_, )], ) .await?; - Ok(String::from_utf8(upstream)?.contains(&format!( + Ok(std::str::from_utf8(&upstream)?.contains(&format!( r###"language":"{}","version":"{}","updated":"{}"###, self.locale.as_ref(), self.version, @@ -111,7 +108,10 @@ impl, D: AsRef, R: CommandRunner> Symbol for Translation<'_, for (source, target) in self.get_pairs() { self .command_runner - .run_successfully("curl", args!["--compressed", "-o", target, source,]) + .run_successfully( + "curl", + args!["--compressed", "-o", target.as_os_str(), source.as_ref(),], + ) .await?; } Ok(()) diff --git a/src/templates/php.rs b/src/templates/php.rs index b0a0026..3fa0ac9 100644 --- a/src/templates/php.rs +++ b/src/templates/php.rs @@ -5,7 +5,7 @@ use std::path::Path; #[derive(Clone, Debug, PartialEq, Hash, Eq)] pub struct FpmPoolConfig { max_children: NonZeroUsize, - custom: Option, + custom: Option>, } impl Display for FpmPoolConfig { @@ -27,7 +27,7 @@ impl From for FpmPoolConfig { } impl FpmPoolConfig { - pub fn new(max_children: NonZeroUsize, custom: impl Into) -> Self { + pub fn new(max_children: NonZeroUsize, custom: impl Into>) -> Self { Self { max_children, custom: Some(custom.into()), diff --git a/tests/file.rs b/tests/file.rs index 3043cdc..62fa620 100644 --- a/tests/file.rs +++ b/tests/file.rs @@ -3,7 +3,7 @@ use schematics::symbols::file::File as FileSymbol; use schematics::symbols::Symbol; use std::fs::File; use std::io::Write; -use std::path::{Path, PathBuf}; +use std::path::Path; use tempfile::{tempdir, TempDir}; fn get_dir(content: Option<&str>) -> TempDir { @@ -19,8 +19,8 @@ fn get_dir(content: Option<&str>) -> TempDir { tmp_dir } -fn get_symbol(path: &Path) -> FileSymbol { - FileSymbol::new(path.join("filename"), "target content") +fn get_symbol(path: &Path) -> FileSymbol, &str> { + FileSymbol::new(path.join("filename").into(), "target content") } // Normal cases diff --git a/tests/setup.rs b/tests/setup.rs index e30520f..1603f86 100644 --- a/tests/setup.rs +++ b/tests/setup.rs @@ -9,6 +9,7 @@ use schematics::SymbolRunner; use slog::{info, Logger as SlogLogger}; use std::error::Error; use std::fmt::Debug; +use std::path::Path; use std::time::Duration; #[derive(Clone, Debug)] @@ -60,7 +61,7 @@ fn test( #[test] fn can_create_an_acme_user() { let mut result = test(1, |setup| { - assert_eq!((run(setup.add(AcmeUser)).unwrap().0).0, "acme"); + assert_eq!(&*(run(setup.add(AcmeUser)).unwrap().0).0, "acme"); }); let entry = result .pop() @@ -133,8 +134,8 @@ fn can_create_an_acme_cert() { #[test] fn can_create_a_git_checkout() { let mut result = test(1, |setup| { - run(setup.add(GitCheckout( - "/tmp/somepath".into(), + run(setup.add(GitCheckout::new( + "/tmp/somepath".as_ref() as &Path, "/tmp/some_src_repo", "master", ))) diff --git a/tests/storage.rs b/tests/storage.rs index 04f2bf5..10bc176 100644 --- a/tests/storage.rs +++ b/tests/storage.rs @@ -16,7 +16,7 @@ fn get_dir<'a, I: IntoIterator>(content: I) -> TempDir { } fn get_storage(path: &Path) -> SimpleStorage { - SimpleStorage::new(path.join("_filename")) + SimpleStorage::new(path.join("_filename").into()) } // Normal cases @@ -33,7 +33,7 @@ fn single_file() { ); assert_eq!( dir.path().join("_filename").join("12345"), - Path::new(&storage.read_filename().unwrap()) + Path::new(&*storage.read_filename().unwrap()) ); assert_eq!(storage.recent_date().unwrap(), 12345); } @@ -50,7 +50,7 @@ fn two_files() { ); assert_eq!( dir.path().join("_filename").join("23456"), - Path::new(&storage.read_filename().unwrap()) + Path::new(&*storage.read_filename().unwrap()) ); assert_eq!(storage.recent_date().unwrap(), 23456); } @@ -67,7 +67,7 @@ fn another_two_files() { ); assert_eq!( dir.path().join("_filename").join("23456"), - Path::new(&storage.read_filename().unwrap()) + Path::new(&*storage.read_filename().unwrap()) ); assert_eq!(storage.recent_date().unwrap(), 23456); } @@ -84,7 +84,7 @@ fn three_files() { ); assert_eq!( dir.path().join("_filename").join("23456"), - Path::new(&storage.read_filename().unwrap()) + Path::new(&*storage.read_filename().unwrap()) ); assert_eq!(storage.recent_date().unwrap(), 23456); }