# modi An out-of-the-box modular dependency injection web application framework. [![Crates.io](https://img.shields.io/crates/v/modi)](https://crates.io/crates/modi) [![Documentation](https://shields.io/docsrs/modi)](https://docs.rs/modi) [![License](https://img.shields.io/crates/l/modi)](https://github.com/andeya/modi?tab=MIT-1-ov-file) ## Install Run the following Cargo command in your project directory: ```sh cargo add modi ``` Or add the following line to your Cargo.toml: ```toml modi = "0.1.0" ``` ## Example ```rust #![allow(missing_docs)] use modi::prelude::*; use std::sync::Arc; #[tokio::main] async fn main() { new_app![Calculate] .with_component_parameters::(CalculateParameters { state: 1 }) .run() .await; } pub trait Service: Interface { fn add(&self, left: i64, right: i64) -> i64; } #[derive(Component)] #[modi(interface = Service)] #[derive(Clone)] pub struct Calculate { state: i64, } impl Interface for Calculate { fn manifest(&self) -> Manifest { Manifest::default() .with_name("Calculate".to_owned()) .with_summary("Calculate. For example, addition.".to_owned()) } fn route(self: Arc, blank_router: Router) -> Router { blank_router .path("calculate") .push(Router::with_path("add1").get(self.add1())) .push(Router::with_path("add2").get(self.add2())) .push(Router::with_path("add3").get(Self::add3())) } } impl Service for Calculate { fn add(&self, left: i64, right: i64) -> i64 { { self.state + left + right } .instrument(info_span!("add")) .into_inner() } } #[craft] impl Calculate { /// doc line 1 /// doc line 2 #[craft(handler)] fn add1(&self, left: QueryParam, right: QueryParam) -> String { self.add(*left, *right).to_string() } /// doc line 3 /// doc line 4 #[craft(endpoint)] pub(crate) fn add2( self: ::std::sync::Arc, left: QueryParam, right: QueryParam, ) -> String { self.add(*left, *right).to_string() } /// doc line 5 /// doc line 6 #[craft(endpoint(responses((status_code = 400, description = "Wrong request parameters."))))] pub fn add3(left: QueryParam, right: QueryParam) -> String { (*left + *right).to_string() } } ``` Browse `http://localhost:8888/swagger-ui` and open the OpenAPI online test.