diff options
author | HampusM <hampus@hampusmat.com> | 2022-11-11 12:42:39 +0100 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-11-11 12:43:08 +0100 |
commit | 3a0432e690f2ad7af4fb7ccf98ccfba6b3d49705 (patch) | |
tree | aaefc45524374e60eccb7540ea4277704e64e19c | |
parent | 4e8951ff740bddb39d9782c18ed85898d0b978fb (diff) |
docs: add a example to the crate root
-rw-r--r-- | src/lib.rs | 82 |
1 files changed, 81 insertions, 1 deletions
@@ -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; |