humblegen 0.4.0

An experimental code-generator in the vain of protobuf, but a little more humble.
Documentation
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = "A wandering monster"]
pub struct Monster {
    #[doc = "Monster ID."]
    pub id: i32,
    #[doc = "The monster's name"]
    pub name: String,
    #[doc = "Max hitpoints."]
    pub hp: i32,
    #[doc = ""]
    pub foo: String,
    #[doc = ""]
    pub bar: String,
}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = ""]
pub struct MonsterData {
    #[doc = "The monster's name"]
    pub name: String,
    #[doc = "Max hitpoints."]
    pub hp: i32,
}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = ""]
pub struct MonsterData2 {
    #[doc = ""]
    pub foo: String,
    #[doc = ""]
    pub bar: String,
}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = "patch of a monster"]
pub struct MonsterPatch {
    #[doc = ""]
    pub name: Option<String>,
    #[doc = ""]
    pub hp: Option<i32>,
    #[doc = ""]
    pub foo: Option<String>,
}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = ""]
pub struct MonsterData3 {
    #[doc = ""]
    pub bar: String,
}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = "Errors returned by the monster service."]
pub enum MonsterError {
    #[doc = ""]
    TooWeak,
    #[doc = ""]
    TooStrong {
        #[doc = ""]
        max_strength: i32,
    },
}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = ""]
pub struct PoliceCar {}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = ""]
pub enum PoliceError {}
#[derive(Debug, Clone, serde :: Deserialize, serde :: Serialize)]
#[doc = ""]
pub struct MonsterQuery {
    #[doc = ""]
    pub name: Option<String>,
    #[doc = ""]
    pub max_age: Option<i32>,
}
#[allow(unused_imports)]
use ::humblegen_rt::deser_helpers::{
    deser_param, deser_post_data, deser_query_primitive, deser_query_serde_urlencoded,
};
#[allow(unused_imports)]
pub use ::humblegen_rt::handler::{self, HandlerResponse as Response, ServiceError};
#[allow(unused_imports)]
use ::humblegen_rt::regexset_map::RegexSetMap;
#[allow(unused_imports)]
use ::humblegen_rt::server::{self, handler_response_to_hyper_response, Route, Service};
#[allow(unused_imports)]
use ::humblegen_rt::service_protocol::ErrorResponse;
use ::humblegen_rt::tracing_futures::Instrument;
#[allow(unused_imports)]
use ::humblegen_rt::{hyper, tracing};
#[allow(unused_imports)]
use ::std::sync::Arc;
use std::net::SocketAddr;
#[doc = r" Builds an HTTP server that exposes services implemented by handler trait objects."]
#[derive(Debug)]
pub struct Builder {
    services: Vec<Service>,
}
impl Builder {
    pub fn new() -> Self {
        Self { services: vec![] }
    }
    #[doc = r" Mounts `handler` at URL path prefix `root`."]
    #[doc = r" This means that a `handler` implementing humble service"]
    #[doc = r" ```"]
    #[doc = r" service S {"]
    #[doc = r"     GET /bar -> i32,"]
    #[doc = r"     GET /baz -> str,"]
    #[doc = r" }"]
    #[doc = r" ```"]
    #[doc = r#" and `root="/api"` will expose"#]
    #[doc = r" * handler method `fn bar() -> i32` at `/api/bar` and"]
    #[doc = r" * handler method `fn baz() -> String` at `/api/baz`"]
    pub fn add<Context: Default + Sized + Send + Sync>(
        mut self,
        root: &str,
        handler: Handler<Context>,
    ) -> Self {
        if !root.starts_with('/') {
            panic!("root must start with \"/\"")
        } else if root.ends_with('/') {
            panic!("root must not end with \"/\"")
        }
        let routes: Vec<Route> = handler.into_routes();
        let routes = RegexSetMap::new(routes).unwrap();
        self.services.push(Service((
            humblegen_rt::regex::Regex::new(&format!(r"^(?P<root>{})(?P<suffix>/.*)", root))
                .unwrap(),
            routes,
        )));
        self
    }
    #[doc = r" Starts an HTTP server bound to address `addr` and serves incoming requests using"]
    #[doc = r" the previously `add`ed handlers."]
    pub async fn listen_and_run_forever(
        self,
        addr: &SocketAddr,
    ) -> humblegen_rt::anyhow::Result<()> {
        use humblegen_rt::anyhow::Context;
        let services = RegexSetMap::new(self.services).context("invalid service configuration")?;
        server::listen_and_run_forever(services, addr).await
    }
}
#[doc = r" Wrapper enum with one variant for each service defined in the humble spec."]
#[doc = r" Used to pass instantiated handler trait objects to `Builder::add`."]
#[allow(dead_code)]
pub enum Handler<Context: Default + Sized + Send + Sync + 'static> {
    Godzilla(Arc<dyn Godzilla<Context = Context> + Send + Sync>),
    Movies(Arc<dyn Movies<Context = Context> + Send + Sync>),
}
impl<Context: Default + Sized + Send + Sync + 'static> Handler<Context> {
    fn into_routes(self) -> Vec<Route> {
        match self {
            Handler::Godzilla(h) => routes_Godzilla(h),
            Handler::Movies(h) => routes_Movies(h),
        }
    }
}
impl<Context: Default + Sized + Send + Sync + 'static> std::fmt::Debug for Handler<Context> {
    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Handler::Godzilla(_) => write!(formatter, "{}", "Godzilla")?,
            Handler::Movies(_) => write!(formatter, "{}", "Movies")?,
        }
        Ok(())
    }
}
#[doc = "service Godzilla provides services related to monsters."]
#[doc = "```\n#[humblegen_rt::async_trait(Sync)]\npub trait Godzilla {\n    type Context: Default + Sized + Send + Sync;\n    async fn intercept_handler_pre(\n        &self,\n        _req: &hyper::Request<hyper::Body>,\n    ) -> Result<Self::Context, ServiceError> {\n        Ok(Self::Context::default())\n    }\n    async fn get_foo(&self, ctx: Self::Context) -> Response<u32>;\n    async fn get_monsters_id(\n        &self,\n        ctx: Self::Context,\n        id: i32,\n    ) -> Response<Result<Monster, MonsterError>>;\n    async fn get_monsters(\n        &self,\n        ctx: Self::Context,\n        query: Option<MonsterQuery>,\n    ) -> Response<Vec<Monster>>;\n    async fn get_monsters_2(\n        &self,\n        ctx: Self::Context,\n        query: Option<String>,\n    ) -> Response<Vec<Monster>>;\n    async fn get_monsters_3(\n        &self,\n        ctx: Self::Context,\n        query: Option<i32>,\n    ) -> Response<Vec<Monster>>;\n    async fn get_monsters_4(&self, ctx: Self::Context) -> Response<Vec<Monster>>;\n    async fn post_monsters(\n        &self,\n        ctx: Self::Context,\n        post_body: MonsterData,\n    ) -> Response<Result<Monster, MonsterError>>;\n    async fn put_monsters_id(\n        &self,\n        ctx: Self::Context,\n        post_body: Monster,\n        id: String,\n    ) -> Response<Result<(), MonsterError>>;\n    async fn patch_monsters_id(\n        &self,\n        ctx: Self::Context,\n        post_body: MonsterPatch,\n        id: String,\n    ) -> Response<Result<(), MonsterError>>;\n    async fn delete_monster_id(\n        &self,\n        ctx: Self::Context,\n        id: String,\n    ) -> Response<Result<(), MonsterError>>;\n    async fn get_version(&self, ctx: Self::Context) -> Response<String>;\n    async fn get_tokio_police_locations(\n        &self,\n        ctx: Self::Context,\n    ) -> Response<Result<Vec<PoliceCar>, PoliceError>>;\n}\n\n```"]
#[humblegen_rt::async_trait(Sync)]
pub trait Godzilla {
    type Context: Default + Sized + Send + Sync;
    async fn intercept_handler_pre(
        &self,
        _req: &hyper::Request<hyper::Body>,
    ) -> Result<Self::Context, ServiceError> {
        Ok(Self::Context::default())
    }
    #[doc = "```\nasync fn get_foo(&self, ctx: Self::Context) -> Response<u32> {}\n\n```"]
    #[doc = "Get foo."]
    async fn get_foo(&self, ctx: Self::Context) -> Response<u32>;
    #[doc = "```\nasync fn get_monsters_id(\n    &self,\n    ctx: Self::Context,\n    id: i32,\n) -> Response<Result<Monster, MonsterError>> {\n}\n\n```"]
    #[doc = "Get monster by id"]
    async fn get_monsters_id(
        &self,
        ctx: Self::Context,
        id: i32,
    ) -> Response<Result<Monster, MonsterError>>;
    #[doc = "```\nasync fn get_monsters(\n    &self,\n    ctx: Self::Context,\n    query: Option<MonsterQuery>,\n) -> Response<Vec<Monster>> {\n}\n\n```"]
    #[doc = "Get monster by posting a query"]
    async fn get_monsters(
        &self,
        ctx: Self::Context,
        query: Option<MonsterQuery>,
    ) -> Response<Vec<Monster>>;
    #[doc = "```\nasync fn get_monsters_2(\n    &self,\n    ctx: Self::Context,\n    query: Option<String>,\n) -> Response<Vec<Monster>> {\n}\n\n```"]
    #[doc = ""]
    async fn get_monsters_2(
        &self,
        ctx: Self::Context,
        query: Option<String>,
    ) -> Response<Vec<Monster>>;
    #[doc = "```\nasync fn get_monsters_3(&self, ctx: Self::Context, query: Option<i32>) -> Response<Vec<Monster>> {}\n\n```"]
    #[doc = ""]
    async fn get_monsters_3(
        &self,
        ctx: Self::Context,
        query: Option<i32>,
    ) -> Response<Vec<Monster>>;
    #[doc = "```\nasync fn get_monsters_4(&self, ctx: Self::Context) -> Response<Vec<Monster>> {}\n\n```"]
    #[doc = ""]
    async fn get_monsters_4(&self, ctx: Self::Context) -> Response<Vec<Monster>>;
    #[doc = "```\nasync fn post_monsters(\n    &self,\n    ctx: Self::Context,\n    post_body: MonsterData,\n) -> Response<Result<Monster, MonsterError>> {\n}\n\n```"]
    #[doc = "Create a new monster."]
    async fn post_monsters(
        &self,
        ctx: Self::Context,
        post_body: MonsterData,
    ) -> Response<Result<Monster, MonsterError>>;
    #[doc = "```\nasync fn put_monsters_id(\n    &self,\n    ctx: Self::Context,\n    post_body: Monster,\n    id: String,\n) -> Response<Result<(), MonsterError>> {\n}\n\n```"]
    #[doc = "Overwrite a monster."]
    async fn put_monsters_id(
        &self,
        ctx: Self::Context,
        post_body: Monster,
        id: String,
    ) -> Response<Result<(), MonsterError>>;
    #[doc = "```\nasync fn patch_monsters_id(\n    &self,\n    ctx: Self::Context,\n    post_body: MonsterPatch,\n    id: String,\n) -> Response<Result<(), MonsterError>> {\n}\n\n```"]
    #[doc = "Patch a monster."]
    async fn patch_monsters_id(
        &self,
        ctx: Self::Context,
        post_body: MonsterPatch,
        id: String,
    ) -> Response<Result<(), MonsterError>>;
    #[doc = "```\nasync fn delete_monster_id(\n    &self,\n    ctx: Self::Context,\n    id: String,\n) -> Response<Result<(), MonsterError>> {\n}\n\n```"]
    #[doc = "Delete a monster"]
    async fn delete_monster_id(
        &self,
        ctx: Self::Context,
        id: String,
    ) -> Response<Result<(), MonsterError>>;
    #[doc = "```\nasync fn get_version(&self, ctx: Self::Context) -> Response<String> {}\n\n```"]
    #[doc = ""]
    async fn get_version(&self, ctx: Self::Context) -> Response<String>;
    #[doc = "```\nasync fn get_tokio_police_locations(\n    &self,\n    ctx: Self::Context,\n) -> Response<Result<Vec<PoliceCar>, PoliceError>> {\n}\n\n```"]
    #[doc = ""]
    async fn get_tokio_police_locations(
        &self,
        ctx: Self::Context,
    ) -> Response<Result<Vec<PoliceCar>, PoliceError>>;
}
#[allow(unused_variables)]
#[allow(unused_mut)]
#[allow(non_snake_case)]
#[allow(clippy::trivial_regex)]
#[allow(clippy::single_char_pattern)]
fn routes_Godzilla<Context: Default + Sized + Send + Sync + 'static>(
    handler: Arc<dyn Godzilla<Context = Context> + Send + Sync>,
) -> Vec<Route> {
    vec![
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/foo$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.get_foo(ctx).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters/(?P<id>[^/]+)$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        let id: Result<i32, ErrorResponse> = deser_param("id", &captures["id"]);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let id = id?;
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.get_monsters_id(ctx, id).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let query: Option<MonsterQuery> = match req.uri().query() {
                                None => None,
                                Some(q) => Some(deser_query_serde_urlencoded(q)?),
                            };
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.get_monsters(ctx, query).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters2$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let query: Option<String> = match req.uri().query() {
                                None => None,
                                Some(q) => Some(deser_query_primitive(q)?),
                            };
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.get_monsters_2(ctx, query).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters3$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let query: Option<i32> = match req.uri().query() {
                                None => None,
                                Some(q) => Some(deser_query_primitive(q)?),
                            };
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.get_monsters_3(ctx, query).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters4$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.get_monsters_4(ctx).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::POST,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let post_body: MonsterData = deser_post_data(req.body_mut()).await?;
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.post_monsters(ctx, post_body).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::PUT,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters/(?P<id>[^/]+)$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        let id: Result<String, ErrorResponse> = deser_param("id", &captures["id"]);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let id = id?;
                            let post_body: Monster = deser_post_data(req.body_mut()).await?;
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler
                                        .put_monsters_id(ctx, post_body, id)
                                        .instrument(span)
                                        .await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::PATCH,
                regex: ::humblegen_rt::regex::Regex::new("^/monsters/(?P<id>[^/]+)$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        let id: Result<String, ErrorResponse> = deser_param("id", &captures["id"]);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let id = id?;
                            let post_body: MonsterPatch = deser_post_data(req.body_mut()).await?;
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler
                                        .patch_monsters_id(ctx, post_body, id)
                                        .instrument(span)
                                        .await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::DELETE,
                regex: ::humblegen_rt::regex::Regex::new("^/monster/(?P<id>[^/]+)$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        let id: Result<String, ErrorResponse> = deser_param("id", &captures["id"]);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            let id = id?;
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.delete_monster_id(ctx, id).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/version$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler.get_version(ctx).instrument(span).await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
        {
            let handler = Arc::clone(&handler);
            Route {
                method: ::humblegen_rt::hyper::Method::GET,
                regex: ::humblegen_rt::regex::Regex::new("^/tokio-police-locations$").unwrap(),
                dispatcher: Box::new(
                    move |mut req: ::humblegen_rt::hyper::Request<::humblegen_rt::hyper::Body>,
                          captures| {
                        let handler = Arc::clone(&handler);
                        Box::pin(async move {
                            use ::humblegen_rt::service_protocol::ToErrorResponse;
                            let ctx = {
                                let span = tracing::error_span!("interceptor");
                                handler . intercept_handler_pre ( & req ) . instrument ( span ) . await . map_err ( :: humblegen_rt :: service_protocol :: ServiceError :: from ) . map_err ( | e | { tracing :: debug ! ( service_error = ? format ! ( "{:?}" , e ) , "interceptor rejected request" ) ; e } ) . map_err ( | e | e . to_error_response ( ) ) ?
                            };
                            drop(req);
                            {
                                let span = tracing::error_span!("handler");
                                Ok(handler_response_to_hyper_response(
                                    handler
                                        .get_tokio_police_locations(ctx)
                                        .instrument(span)
                                        .await,
                                ))
                            }
                        })
                    },
                ),
            }
        },
    ]
}
#[doc = ""]
#[doc = "```\n#[humblegen_rt::async_trait(Sync)]\npub trait Movies {\n    type Context: Default + Sized + Send + Sync;\n    async fn intercept_handler_pre(\n        &self,\n        _req: &hyper::Request<hyper::Body>,\n    ) -> Result<Self::Context, ServiceError> {\n        Ok(Self::Context::default())\n    }\n}\n\n```"]
#[humblegen_rt::async_trait(Sync)]
pub trait Movies {
    type Context: Default + Sized + Send + Sync;
    async fn intercept_handler_pre(
        &self,
        _req: &hyper::Request<hyper::Body>,
    ) -> Result<Self::Context, ServiceError> {
        Ok(Self::Context::default())
    }
}
#[allow(unused_variables)]
#[allow(unused_mut)]
#[allow(non_snake_case)]
#[allow(clippy::trivial_regex)]
#[allow(clippy::single_char_pattern)]
fn routes_Movies<Context: Default + Sized + Send + Sync + 'static>(
    handler: Arc<dyn Movies<Context = Context> + Send + Sync>,
) -> Vec<Route> {
    vec![]
}