Start with SchematicsFactory and bin
This commit is contained in:
parent
c91eb2f04e
commit
0bc56a8f69
8 changed files with 157 additions and 30 deletions
|
|
@ -13,7 +13,6 @@ pub struct SymbolFactory<'a, C: 'a + CommandRunner, R: 'a + SymbolRunner>{
|
|||
}
|
||||
|
||||
impl<'b, C: 'b + CommandRunner, R: 'b + SymbolRunner> SymbolFactory<'b, C, R> {
|
||||
|
||||
pub fn new(command_runner: &'b C, symbol_runner: &'b R) -> Self {
|
||||
let acme_user = "acme"; // FIXME: CONFIG
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,12 @@ 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>>;
|
||||
|
|
|
|||
|
|
@ -7,14 +7,14 @@ use command_runner::CommandRunner;
|
|||
use resources::Resource;
|
||||
use symbols::{Action, OwnedSymbolAction, Symbol, SymbolAction, SymbolRunner};
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
pub enum UserAdderError<E: Error> {
|
||||
#[derive(Debug)]
|
||||
pub enum UserAdderError {
|
||||
AlreadyExists,
|
||||
UnknownError,
|
||||
ImplError(E)
|
||||
ImplError(Box<Error>)
|
||||
}
|
||||
|
||||
impl<E: Error> Error for UserAdderError<E> {
|
||||
impl Error for UserAdderError {
|
||||
fn description(&self) -> &str {
|
||||
match self {
|
||||
&UserAdderError::AlreadyExists => "User already exists",
|
||||
|
|
@ -24,13 +24,13 @@ impl<E: Error> Error for UserAdderError<E> {
|
|||
}
|
||||
fn cause(&self) -> Option<&Error> {
|
||||
match self {
|
||||
&UserAdderError::ImplError(ref e) => Some(e),
|
||||
&UserAdderError::ImplError(ref e) => Some(e.as_ref()),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<E: Error> fmt::Display for UserAdderError<E> {
|
||||
impl fmt::Display for UserAdderError {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match self.cause() {
|
||||
Some(e) => write!(f, "{} (cause: {})", self.description(), e),
|
||||
|
|
@ -40,8 +40,7 @@ impl<E: Error> fmt::Display for UserAdderError<E> {
|
|||
}
|
||||
|
||||
pub trait UserAdder {
|
||||
type SubE: Error;
|
||||
fn add_user(&self, user_name: &str) -> Result<(), UserAdderError<Self::SubE>>;
|
||||
fn add_user(&self, user_name: &str) -> Result<(), UserAdderError>;
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq)]
|
||||
|
|
@ -71,13 +70,13 @@ impl fmt::Display for UserError {
|
|||
}
|
||||
}
|
||||
|
||||
pub struct User<'a, C: 'a + CommandRunner, E, A> where E: Error + Sized, A: 'a + UserAdder<SubE=E> {
|
||||
pub struct User<'a, C: 'a + CommandRunner, A: 'a + UserAdder> {
|
||||
user_name: Cow<'a, str>,
|
||||
command_runner: &'a C,
|
||||
user_adder: &'a A
|
||||
}
|
||||
|
||||
impl<'a, C: CommandRunner, E: Error + Sized, A: 'a + UserAdder<SubE=E>> User<'a, C, E, A> {
|
||||
impl<'a, C: CommandRunner, A: 'a + UserAdder> User<'a, C, A> {
|
||||
pub fn new(user_name: Cow<'a, str>, command_runner: &'a C, user_adder: &'a A) -> Self {
|
||||
User {
|
||||
user_name: user_name,
|
||||
|
|
@ -87,13 +86,13 @@ impl<'a, C: CommandRunner, E: Error + Sized, A: 'a + UserAdder<SubE=E>> User<'a,
|
|||
}
|
||||
}
|
||||
|
||||
impl<'a, C: CommandRunner, E: Error, A: UserAdder<SubE=E>> fmt::Display for User<'a, C, E, A> {
|
||||
impl<'a, C: CommandRunner, A: 'a + UserAdder> fmt::Display for User<'a, C, A> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
write!(f, "User {}", self.user_name)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, C: CommandRunner, E: 'static + Error, A: UserAdder<SubE=E>> Symbol for User<'a, C, E, A> {
|
||||
impl<'a, C: CommandRunner, A: 'a + UserAdder> Symbol for User<'a, C, A> {
|
||||
fn target_reached(&self) -> Result<bool, Box<Error>> {
|
||||
let output = try!(self.command_runner.run_with_args("getent", &["passwd", &*self.user_name]));
|
||||
match output.status.code() {
|
||||
|
|
@ -131,8 +130,7 @@ impl<'a, C: CommandRunner> SystemUserAdder<'a, C> {
|
|||
}
|
||||
|
||||
impl<'a, C: CommandRunner> UserAdder for SystemUserAdder<'a, C> {
|
||||
type SubE = IoError;
|
||||
fn add_user(&self, user_name: &str) -> Result<(), UserAdderError<IoError>> {
|
||||
fn add_user(&self, user_name: &str) -> Result<(), UserAdderError> {
|
||||
let output = self.command_runner.run_with_args(
|
||||
"adduser",
|
||||
&[
|
||||
|
|
@ -157,7 +155,7 @@ Err(UserAdderError::UnknownError)
|
|||
Err(UserAdderError::UnknownError)
|
||||
},
|
||||
},
|
||||
Err(e) => Err(UserAdderError::ImplError(e))
|
||||
Err(e) => Err(UserAdderError::ImplError(Box::new(e)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -190,8 +188,7 @@ mod test {
|
|||
struct DummyUserAdder;
|
||||
|
||||
impl UserAdder for DummyUserAdder {
|
||||
type SubE = DummyError;
|
||||
fn add_user(&self, user_name: &str) -> Result<(), UserAdderError<Self::SubE>> {
|
||||
fn add_user(&self, user_name: &str) -> Result<(), UserAdderError> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue