1
0
Fork 0
mirror of https://gitlab.com/msrd0/gotham-restful.git synced 2025-02-22 20:52:27 +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);
}
pub struct OpenapiRouter<'a, D>
{
pub router : &'a mut D,
pub openapi_builder : &'a mut OpenapiBuilder
}
macro_rules! implOpenapiRouter {
($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
C : PipelineHandleChain<P> + Copy + Send + Sync + 'static,
P : RefUnwindSafe + Send + Sync + 'static
{
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
C : PipelineHandleChain<P> + Copy + 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
C : PipelineHandleChain<P> + Copy + Send + Sync + 'static,
P : RefUnwindSafe + Send + Sync + 'static
{
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 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());
(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)
{
let schema = (self.0).1.add_schema::<Handler::Res>();
let id_schema = (self.0).1.add_schema::<Handler::ID>();
let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let id_schema = (self.0).openapi_builder.add_schema::<Handler::ID>();
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());
(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)
{
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 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());
(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)
@ -88,15 +94,15 @@ macro_rules! implOpenapiRouter {
Handler::Res : 'static,
Handler::Body : 'static
{
let schema = (self.0).1.add_schema::<Handler::Res>();
let body_schema = (self.0).1.add_schema::<Handler::Body>();
let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let body_schema = (self.0).openapi_builder.add_schema::<Handler::Body>();
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());
(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)
@ -104,15 +110,15 @@ macro_rules! implOpenapiRouter {
Handler::Res : 'static,
Handler::Body : 'static
{
let schema = (self.0).1.add_schema::<Handler::Res>();
let body_schema = (self.0).1.add_schema::<Handler::Body>();
let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let body_schema = (self.0).openapi_builder.add_schema::<Handler::Body>();
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());
(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)
@ -120,41 +126,41 @@ macro_rules! implOpenapiRouter {
Handler::Res : 'static,
Handler::Body : 'static
{
let schema = (self.0).1.add_schema::<Handler::Res>();
let id_schema = (self.0).1.add_schema::<Handler::ID>();
let body_schema = (self.0).1.add_schema::<Handler::Body>();
let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let id_schema = (self.0).openapi_builder.add_schema::<Handler::ID>();
let body_schema = (self.0).openapi_builder.add_schema::<Handler::Body>();
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());
(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)
{
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 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());
(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)
{
let schema = (self.0).1.add_schema::<Handler::Res>();
let id_schema = (self.0).1.add_schema::<Handler::ID>();
let schema = (self.0).openapi_builder.add_schema::<Handler::Res>();
let id_schema = (self.0).openapi_builder.add_schema::<Handler::ID>();
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());
(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::{
matcher::{AcceptHeaderMatcher, ContentTypeMatcher},
openapi::router::OpenapiRouter,
resource::*,
result::{ResourceError, ResourceResult, Response},
RequestBody,
@ -49,7 +50,7 @@ pub trait WithOpenapi<D>
{
fn with_openapi<F>(&mut self, title : String, version : String, server_url : String, block : F)
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
@ -316,10 +317,13 @@ macro_rules! implDrawResourceRoutes {
{
fn with_openapi<F>(&mut self, title : String, version : String, server_url : String, block : F)
where
F : FnOnce((&mut Self, &mut OpenapiBuilder))
F : FnOnce(OpenapiRouter<$implType<'a, C, P>>)
{
let mut router = OpenapiBuilder::new(title, version, server_url);
block((self, &mut router));
let router = OpenapiRouter {
router: self,
openapi_builder: &mut OpenapiBuilder::new(title, version, server_url)
};
block(router);
}
}