#![allow(missing_docs)] use modi::prelude::*; use std::{env, sync::Arc}; #[tokio::main] async fn main() { env::set_var(ENV_MODI_DEBUG, "1"); 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() } }