From 124b639e5093151168ab95837c761117c63d8f6d Mon Sep 17 00:00:00 2001 From: Adrian Heine Date: Thu, 16 Feb 2017 18:35:54 +0100 Subject: [PATCH] WIP Repository and resources --- src/lib.rs | 2 ++ src/repository.rs | 30 ++++++++++++++++++++++++++++++ src/resources/mod.rs | 13 +++++++++++++ src/symbols/user.rs | 9 +++++---- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/repository.rs create mode 100644 src/resources/mod.rs diff --git a/src/lib.rs b/src/lib.rs index 401006a..21d86c1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -24,3 +24,5 @@ pub mod command_runner; pub mod loggers; pub mod symbols; pub mod schema; +pub mod repository; +pub mod resources; diff --git a/src/repository.rs b/src/repository.rs new file mode 100644 index 0000000..25a01a2 --- /dev/null +++ b/src/repository.rs @@ -0,0 +1,30 @@ +use std::collections::HashMap; + +use symbols::Symbol; +use resources::Resource; + +pub trait SymbolRepository<'a> { + fn get_symbol(&self, resource: &Resource) -> Option>; +} + +impl<'a, C> SymbolRepository<'a> for C where C: Fn(&Resource) -> Option> { + fn get_symbol(&self, resource: &Resource) -> Option> { + self(resource) + } +} + +pub struct DispatchingSymbolRepository<'a> { + repositories: HashMap<&'a str, Box + 'a>> +} + +impl<'a> DispatchingSymbolRepository<'a> { + pub fn new(repositories: HashMap<&'a str, Box + 'a>>) -> DispatchingSymbolRepository<'a> { + DispatchingSymbolRepository { repositories: repositories } + } +} + +impl<'a> SymbolRepository<'a> for DispatchingSymbolRepository<'a> { + fn get_symbol(&self, resource: &Resource) -> Option> { + self.repositories.get(resource.get_type()).and_then(|repo| repo.get_symbol(resource)) + } +} diff --git a/src/resources/mod.rs b/src/resources/mod.rs new file mode 100644 index 0000000..1c3e3e6 --- /dev/null +++ b/src/resources/mod.rs @@ -0,0 +1,13 @@ +pub trait Resource { + fn get_type(&self) -> &str; + fn get_value(&self) -> &str; +} + +pub struct UserResource<'a> { + pub name: &'a str +} + +impl<'a> Resource for UserResource<'a> { + fn get_type(&self) -> &str { "user" } + fn get_value(&self) -> &str { self.name } +} diff --git a/src/symbols/user.rs b/src/symbols/user.rs index eaa8252..0ed9e79 100644 --- a/src/symbols/user.rs +++ b/src/symbols/user.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::error::Error; use std::fmt; use std::io::Error as IoError; @@ -70,13 +71,13 @@ impl fmt::Display for UserError { } pub struct User<'a, E, A> where E: Error + Sized, A: 'a + UserAdder { - user_name: &'a str, + user_name: Cow<'a, str>, command_runner: &'a CommandRunner, user_adder: &'a A } impl<'a, E: Error + Sized, A: 'a + UserAdder> User<'a, E, A> { - pub fn new(user_name: &'a str, command_runner: &'a CommandRunner, user_adder: &'a A) -> User<'a, E, A> { + pub fn new(user_name: Cow<'a, str>, command_runner: &'a CommandRunner, user_adder: &'a A) -> User<'a, E, A> { User { user_name: user_name, command_runner: command_runner, @@ -93,7 +94,7 @@ impl<'a, E: Error, A: UserAdder> fmt::Display for User<'a, E, A> { impl<'a, E: 'static + Error, A: UserAdder> Symbol for User<'a, E, A> { fn target_reached(&self) -> Result> { - let output = self.command_runner.run_with_args("getent", &["passwd", self.user_name]); + let output = self.command_runner.run_with_args("getent", &["passwd", &*self.user_name]); match output { Ok(output) => match output.status.code() { Some(2) => Ok(false), @@ -105,7 +106,7 @@ impl<'a, E: 'static + Error, A: UserAdder> Symbol for User<'a, E, A> { } fn execute(&self) -> Result<(), Box> { - self.user_adder.add_user(self.user_name).map_err(|e| Box::new(e) as Box) + self.user_adder.add_user(&*self.user_name).map_err(|e| Box::new(e) as Box) } }