modi

Crates.iomodi
lib.rsmodi
version0.1.1
sourcesrc
created_at2024-09-23 14:22:41.146779
updated_at2024-09-23 19:13:41.014646
descriptionAn out-of-the-box modular dependency injection web application framework.
homepagehttps://github.com/andeya/modi
repositoryhttps://github.com/andeya/modi
max_upload_size
id1384138
size137,149
Andeya (andeya)

documentation

https://docs.rs/modi

README

modi

An out-of-the-box modular dependency injection web application framework.

Crates.io Documentation License

Install

Run the following Cargo command in your project directory:

cargo add modi

Or add the following line to your Cargo.toml:

modi = "0.1.0"

Example

#![allow(missing_docs)]

use modi::prelude::*;
use std::sync::Arc;

#[tokio::main]
async fn main() {
    new_app![Calculate]
        .with_component_parameters::<Calculate>(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<Self>, 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<i64, true>, right: QueryParam<i64, true>) -> String {
        self.add(*left, *right).to_string()
    }
    /// doc line 3
    /// doc line 4
    #[craft(endpoint)]
    pub(crate) fn add2(
        self: ::std::sync::Arc<Self>,
        left: QueryParam<i64, true>,
        right: QueryParam<i64, true>,
    ) -> 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<i64, true>, right: QueryParam<i64, true>) -> String {
        (*left + *right).to_string()
    }
}

Browse http://localhost:8888/swagger-ui and open the OpenAPI online test.

Commit count: 0

cargo fmt