1
0
Fork 0
mirror of https://gitlab.com/msrd0/gotham-restful.git synced 2025-02-23 04:52:28 +00:00

remove some of the &mut &mut types (#6)

This commit is contained in:
Dominic 2020-04-29 19:22:32 +02:00
parent 45eac21726
commit e013af8e18
Signed by: msrd0
GPG key ID: DCC8C247452E98F9
2 changed files with 56 additions and 46 deletions

View file

@ -16,21 +16,27 @@ pub trait GetOpenapi
fn get_openapi(&mut self, path : &str); fn get_openapi(&mut self, path : &str);
} }
pub struct OpenapiRouter<'a, D>
{
pub router : &'a mut D,
pub openapi_builder : &'a mut OpenapiBuilder
}
macro_rules! implOpenapiRouter { macro_rules! implOpenapiRouter {
($implType:ident) => { ($implType:ident) => {
impl<'a, C, P> GetOpenapi for (&mut $implType<'a, C, P>, &mut OpenapiBuilder) impl<'a, 'b, C, P> GetOpenapi for OpenapiRouter<'a, $implType<'b, C, P>>
where where
C : PipelineHandleChain<P> + Copy + Send + Sync + 'static, C : PipelineHandleChain<P> + Copy + Send + Sync + 'static,
P : RefUnwindSafe + Send + Sync + 'static P : RefUnwindSafe + Send + Sync + 'static
{ {
fn get_openapi(&mut self, path : &str) fn get_openapi(&mut self, path : &str)
{ {
self.0.get(path).to_new_handler(OpenapiHandler::new(self.1.openapi.clone())); self.router.get(path).to_new_handler(OpenapiHandler::new(self.openapi_builder.openapi.clone()));
} }
} }
impl<'a, C, P> DrawResources for (&mut $implType<'a, C, P>, &mut OpenapiBuilder) impl<'a, 'b, C, P> DrawResources for OpenapiRouter<'a, $implType<'b, C, P>>
where where
C : PipelineHandleChain<P> + Copy + Send + Sync + 'static, C : PipelineHandleChain<P> + Copy + Send + Sync + 'static,
P : RefUnwindSafe + Send + Sync + 'static P : RefUnwindSafe + Send + Sync + 'static
@ -41,46 +47,46 @@ macro_rules! implOpenapiRouter {
} }
} }
impl<'a, C, P> DrawResourceRoutes for (&mut (&mut $implType<'a, C, P>, &mut OpenapiBuilder), &str) impl<'a, 'b, C, P> DrawResourceRoutes for (&mut OpenapiRouter<'a, $implType<'b, C, P>>, &str)
where where
C : PipelineHandleChain<P> + Copy + Send + Sync + 'static, C : PipelineHandleChain<P> + Copy + Send + Sync + 'static,
P : RefUnwindSafe + Send + Sync + 'static P : RefUnwindSafe + Send + Sync + 'static
{ {
fn read_all<Handler : ResourceReadAll>(&mut self) fn read_all<Handler : ResourceReadAll>(&mut self)
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let path = format!("/{}", &self.1); let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path); let mut item = (self.0).openapi_builder.remove_path(&path);
item.get = Some(OperationDescription::new::<Handler>(schema).into_operation()); item.get = Some(OperationDescription::new::<Handler>(schema).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).read_all::<Handler>() (&mut *(self.0).router, self.1).read_all::<Handler>()
} }
fn read<Handler : ResourceRead>(&mut self) fn read<Handler : ResourceRead>(&mut self)
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let id_schema = (self.0).1.add_schema::<Handler::ID>(); let id_schema = (self.0).openapi_builder.add_schema::<Handler::ID>();
let path = format!("/{}/{{id}}", &self.1); let path = format!("/{}/{{id}}", &self.1);
let mut item = (self.0).1.remove_path(&path); let mut item = (self.0).openapi_builder.remove_path(&path);
item.get = Some(OperationDescription::new::<Handler>(schema).add_path_param("id", id_schema).into_operation()); item.get = Some(OperationDescription::new::<Handler>(schema).add_path_param("id", id_schema).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).read::<Handler>() (&mut *(self.0).router, self.1).read::<Handler>()
} }
fn search<Handler : ResourceSearch>(&mut self) fn search<Handler : ResourceSearch>(&mut self)
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let path = format!("/{}/search", &self.1); let path = format!("/{}/search", &self.1);
let mut item = (self.0).1.remove_path(&self.1); let mut item = (self.0).openapi_builder.remove_path(&self.1);
item.get = Some(OperationDescription::new::<Handler>(schema).with_query_params(Handler::Query::schema()).into_operation()); item.get = Some(OperationDescription::new::<Handler>(schema).with_query_params(Handler::Query::schema()).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).search::<Handler>() (&mut *(self.0).router, self.1).search::<Handler>()
} }
fn create<Handler : ResourceCreate>(&mut self) fn create<Handler : ResourceCreate>(&mut self)
@ -88,15 +94,15 @@ macro_rules! implOpenapiRouter {
Handler::Res : 'static, Handler::Res : 'static,
Handler::Body : 'static Handler::Body : 'static
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let body_schema = (self.0).1.add_schema::<Handler::Body>(); let body_schema = (self.0).openapi_builder.add_schema::<Handler::Body>();
let path = format!("/{}", &self.1); let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path); let mut item = (self.0).openapi_builder.remove_path(&path);
item.post = Some(OperationDescription::new::<Handler>(schema).with_body::<Handler::Body>(body_schema).into_operation()); item.post = Some(OperationDescription::new::<Handler>(schema).with_body::<Handler::Body>(body_schema).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).create::<Handler>() (&mut *(self.0).router, self.1).create::<Handler>()
} }
fn update_all<Handler : ResourceUpdateAll>(&mut self) fn update_all<Handler : ResourceUpdateAll>(&mut self)
@ -104,15 +110,15 @@ macro_rules! implOpenapiRouter {
Handler::Res : 'static, Handler::Res : 'static,
Handler::Body : 'static Handler::Body : 'static
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let body_schema = (self.0).1.add_schema::<Handler::Body>(); let body_schema = (self.0).openapi_builder.add_schema::<Handler::Body>();
let path = format!("/{}", &self.1); let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path); let mut item = (self.0).openapi_builder.remove_path(&path);
item.put = Some(OperationDescription::new::<Handler>(schema).with_body::<Handler::Body>(body_schema).into_operation()); item.put = Some(OperationDescription::new::<Handler>(schema).with_body::<Handler::Body>(body_schema).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).update_all::<Handler>() (&mut *(self.0).router, self.1).update_all::<Handler>()
} }
fn update<Handler : ResourceUpdate>(&mut self) fn update<Handler : ResourceUpdate>(&mut self)
@ -120,41 +126,41 @@ macro_rules! implOpenapiRouter {
Handler::Res : 'static, Handler::Res : 'static,
Handler::Body : 'static Handler::Body : 'static
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let id_schema = (self.0).1.add_schema::<Handler::ID>(); let id_schema = (self.0).openapi_builder.add_schema::<Handler::ID>();
let body_schema = (self.0).1.add_schema::<Handler::Body>(); let body_schema = (self.0).openapi_builder.add_schema::<Handler::Body>();
let path = format!("/{}/{{id}}", &self.1); let path = format!("/{}/{{id}}", &self.1);
let mut item = (self.0).1.remove_path(&path); let mut item = (self.0).openapi_builder.remove_path(&path);
item.put = Some(OperationDescription::new::<Handler>(schema).add_path_param("id", id_schema).with_body::<Handler::Body>(body_schema).into_operation()); item.put = Some(OperationDescription::new::<Handler>(schema).add_path_param("id", id_schema).with_body::<Handler::Body>(body_schema).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).update::<Handler>() (&mut *(self.0).router, self.1).update::<Handler>()
} }
fn delete_all<Handler : ResourceDeleteAll>(&mut self) fn delete_all<Handler : ResourceDeleteAll>(&mut self)
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let path = format!("/{}", &self.1); let path = format!("/{}", &self.1);
let mut item = (self.0).1.remove_path(&path); let mut item = (self.0).openapi_builder.remove_path(&path);
item.delete = Some(OperationDescription::new::<Handler>(schema).into_operation()); item.delete = Some(OperationDescription::new::<Handler>(schema).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).delete_all::<Handler>() (&mut *(self.0).router, self.1).delete_all::<Handler>()
} }
fn delete<Handler : ResourceDelete>(&mut self) fn delete<Handler : ResourceDelete>(&mut self)
{ {
let schema = (self.0).1.add_schema::<Handler::Res>(); let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let id_schema = (self.0).1.add_schema::<Handler::ID>(); let id_schema = (self.0).openapi_builder.add_schema::<Handler::ID>();
let path = format!("/{}/{{id}}", &self.1); let path = format!("/{}/{{id}}", &self.1);
let mut item = (self.0).1.remove_path(&path); let mut item = (self.0).openapi_builder.remove_path(&path);
item.delete = Some(OperationDescription::new::<Handler>(schema).add_path_param("id", id_schema).into_operation()); item.delete = Some(OperationDescription::new::<Handler>(schema).add_path_param("id", id_schema).into_operation());
(self.0).1.add_path(path, item); (self.0).openapi_builder.add_path(path, item);
(&mut *(self.0).0, self.1).delete::<Handler>() (&mut *(self.0).router, self.1).delete::<Handler>()
} }
} }

View file

@ -1,5 +1,6 @@
use crate::{ use crate::{
matcher::{AcceptHeaderMatcher, ContentTypeMatcher}, matcher::{AcceptHeaderMatcher, ContentTypeMatcher},
openapi::router::OpenapiRouter,
resource::*, resource::*,
result::{ResourceError, ResourceResult, Response}, result::{ResourceError, ResourceResult, Response},
RequestBody, RequestBody,
@ -49,7 +50,7 @@ pub trait WithOpenapi<D>
{ {
fn with_openapi<F>(&mut self, title : String, version : String, server_url : String, block : F) fn with_openapi<F>(&mut self, title : String, version : String, server_url : String, block : F)
where where
F : FnOnce((&mut D, &mut OpenapiBuilder)); F : FnOnce(OpenapiRouter<D>);
} }
/// This trait adds the `resource` method to gotham's routing. It allows you to register /// This trait adds the `resource` method to gotham's routing. It allows you to register
@ -316,10 +317,13 @@ macro_rules! implDrawResourceRoutes {
{ {
fn with_openapi<F>(&mut self, title : String, version : String, server_url : String, block : F) fn with_openapi<F>(&mut self, title : String, version : String, server_url : String, block : F)
where where
F : FnOnce((&mut Self, &mut OpenapiBuilder)) F : FnOnce(OpenapiRouter<$implType<'a, C, P>>)
{ {
let mut router = OpenapiBuilder::new(title, version, server_url); let router = OpenapiRouter {
block((self, &mut router)); router: self,
openapi_builder: &mut OpenapiBuilder::new(title, version, server_url)
};
block(router);
} }
} }