aboutsummaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2022-11-11 12:42:39 +0100
committerHampusM <hampus@hampusmat.com>2022-11-11 12:43:08 +0100
commit3a0432e690f2ad7af4fb7ccf98ccfba6b3d49705 (patch)
treeaaefc45524374e60eccb7540ea4277704e64e19c /src/lib.rs
parent4e8951ff740bddb39d9782c18ed85898d0b978fb (diff)
docs: add a example to the crate root
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs82
1 files changed, 81 insertions, 1 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 3bddf1b..3bb921b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,7 +7,87 @@
//! Syrette
//!
-//! Syrette is a collection of utilities useful for performing dependency injection.
+//! Syrette is a framework for utilizing inversion of control & dependency injection.
+//!
+//! # Example
+//! ```
+//! use std::error::Error;
+//!
+//! use syrette::di_container::blocking::prelude::*;
+//! use syrette::injectable;
+//! use syrette::ptr::TransientPtr;
+//!
+//! trait IWeapon
+//! {
+//! fn deal_damage(&self, damage: i32);
+//! }
+//!
+//! struct Sword {}
+//!
+//! #[injectable(IWeapon)] // Makes Sword injectable with a interface of IWeapon
+//! impl Sword
+//! {
+//! fn new() -> Self
+//! {
+//! Self {}
+//! }
+//! }
+//!
+//! impl IWeapon for Sword
+//! {
+//! fn deal_damage(&self, damage: i32)
+//! {
+//! println!("Sword dealt {} damage!", damage);
+//! }
+//! }
+//!
+//! trait IWarrior
+//! {
+//! fn fight(&self);
+//! }
+//!
+//! struct Warrior
+//! {
+//! weapon: TransientPtr<dyn IWeapon>,
+//! }
+//!
+//! #[injectable(IWarrior)] // Makes Warrior injectable with a interface of IWarrior
+//! impl Warrior
+//! {
+//! fn new(weapon: TransientPtr<dyn IWeapon>) -> Self
+//! {
+//! Self { weapon }
+//! }
+//! }
+//!
+//! impl IWarrior for Warrior
+//! {
+//! fn fight(&self)
+//! {
+//! self.weapon.deal_damage(30);
+//! }
+//! }
+//!
+//! fn main() -> Result<(), Box<dyn Error>>
+//! {
+//! let mut di_container = DIContainer::new();
+//!
+//! // Creates a binding of the interface IWeapon to the concrete type Sword
+//! di_container.bind::<dyn IWeapon>().to::<Sword>()?;
+//!
+//! // Creates a binding of the interface IWarrior to the concrete type Warrior
+//! di_container.bind::<dyn IWarrior>().to::<Warrior>()?;
+//!
+//! // Create a transient IWarrior with all of its dependencies automatically injected
+//! let warrior = di_container.get::<dyn IWarrior>()?.transient()?;
+//!
+//! warrior.fight();
+//!
+//! println!("Warrior has fighted");
+//!
+//! Ok(())
+//! }
+//! ```
pub mod dependency_history;
pub mod di_container;