diff options
author | HampusM <hampus@hampusmat.com> | 2022-07-22 13:25:45 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-07-22 13:25:45 +0200 |
commit | 4cb3884e24b3cba3347ff93475bbabd6fe18d2fa (patch) | |
tree | 2fa5e6d81de9dc39bd11d64797914e5d305d98e2 /examples/factory | |
parent | 157f38bc2287dcb9a8b21ef3d5e33c569dc5136e (diff) |
refactor: make factories an optional feature
Diffstat (limited to 'examples/factory')
-rw-r--r-- | examples/factory/bootstrap.rs | 24 | ||||
-rw-r--r-- | examples/factory/interfaces/mod.rs | 1 | ||||
-rw-r--r-- | examples/factory/interfaces/user.rs | 13 | ||||
-rw-r--r-- | examples/factory/main.rs | 47 | ||||
-rw-r--r-- | examples/factory/user.rs | 42 |
5 files changed, 127 insertions, 0 deletions
diff --git a/examples/factory/bootstrap.rs b/examples/factory/bootstrap.rs new file mode 100644 index 0000000..5086b1a --- /dev/null +++ b/examples/factory/bootstrap.rs @@ -0,0 +1,24 @@ +use syrette::ptr::InterfacePtr; +use syrette::DIContainer; + +// Interfaces +use crate::interfaces::user::{IUser, IUserFactory}; +// +// Concrete implementations +use crate::user::User; + +pub fn bootstrap() -> DIContainer +{ + let mut di_container: DIContainer = DIContainer::new(); + + di_container + .bind::<IUserFactory>() + .to_factory(&|name, date_of_birth, password| { + let user: InterfacePtr<dyn IUser> = + InterfacePtr::new(User::new(name, date_of_birth, password)); + + user + }); + + di_container +} diff --git a/examples/factory/interfaces/mod.rs b/examples/factory/interfaces/mod.rs new file mode 100644 index 0000000..22d12a3 --- /dev/null +++ b/examples/factory/interfaces/mod.rs @@ -0,0 +1 @@ +pub mod user; diff --git a/examples/factory/interfaces/user.rs b/examples/factory/interfaces/user.rs new file mode 100644 index 0000000..70cd632 --- /dev/null +++ b/examples/factory/interfaces/user.rs @@ -0,0 +1,13 @@ +use syrette::factory; +use syrette::interfaces::factory::IFactory; + +pub trait IUser +{ + fn get_name(&self) -> &'static str; + fn get_date_of_birth(&self) -> &'static str; + fn get_password(&self) -> &'static str; +} + +#[factory] +pub type IUserFactory = + dyn IFactory<(&'static str, &'static str, &'static str), dyn IUser>; diff --git a/examples/factory/main.rs b/examples/factory/main.rs new file mode 100644 index 0000000..c659f3e --- /dev/null +++ b/examples/factory/main.rs @@ -0,0 +1,47 @@ +#![deny(clippy::all)] +#![deny(clippy::pedantic)] +#![allow(clippy::module_name_repetitions)] + +mod bootstrap; +mod interfaces; +mod user; + +use bootstrap::bootstrap; +use interfaces::user::IUser; +use interfaces::user::IUserFactory; +use syrette::ptr::FactoryPtr; +use syrette::ptr::InterfacePtr; + +fn add_users( + users: &mut Vec<InterfacePtr<dyn IUser>>, + user_factory: &FactoryPtr<IUserFactory>, +) +{ + users.push(user_factory("Bob", "1983-04-13", "abc1234")); + users.push(user_factory("Anna", "1998-01-20", "IlovemYCat")); + users.push(user_factory("David", "2000-11-05", "12345678")); +} + +fn main() +{ + println!("Hello, world!"); + + let di_container = bootstrap(); + + let user_factory = di_container.get_factory::<IUserFactory>().unwrap(); + + let mut users = Vec::<InterfacePtr<dyn IUser>>::new(); + + add_users(&mut users, &user_factory); + + println!("Printing user information"); + + for user in users { + println!( + "{}, born {}, password is '{}'", + user.get_name(), + user.get_date_of_birth(), + user.get_password() + ); + } +} diff --git a/examples/factory/user.rs b/examples/factory/user.rs new file mode 100644 index 0000000..121ad25 --- /dev/null +++ b/examples/factory/user.rs @@ -0,0 +1,42 @@ +use crate::interfaces::user::IUser; + +pub struct User +{ + name: &'static str, + date_of_birth: &'static str, + password: &'static str, +} + +impl User +{ + pub fn new( + name: &'static str, + date_of_birth: &'static str, + password: &'static str, + ) -> Self + { + Self { + name, + date_of_birth, + password, + } + } +} + +impl IUser for User +{ + fn get_name(&self) -> &'static str + { + self.name.clone() + } + + fn get_date_of_birth(&self) -> &'static str + { + self.date_of_birth.clone() + } + + fn get_password(&self) -> &'static str + { + self.password.clone() + } +} |