From 0863d41084c9a62f47b77d8a87ddac4d16876ea2 Mon Sep 17 00:00:00 2001 From: Dominic Date: Sun, 20 Oct 2019 16:01:57 +0200 Subject: [PATCH] respect mime types in openapi router --- gotham_restful/src/openapi/router.rs | 44 ++++++++++++++-------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/gotham_restful/src/openapi/router.rs b/gotham_restful/src/openapi/router.rs index ae32444..3500df5 100644 --- a/gotham_restful/src/openapi/router.rs +++ b/gotham_restful/src/openapi/router.rs @@ -19,7 +19,7 @@ use gotham::{ use hyper::Body; use indexmap::IndexMap; use log::error; -use mime::{APPLICATION_JSON, TEXT_PLAIN}; +use mime::{Mime, APPLICATION_JSON, TEXT_PLAIN}; use openapiv3::{ Components, MediaType, OpenAPI, Operation, Parameter, ParameterData, ParameterSchemaOrContent, PathItem, Paths, ReferenceOr, ReferenceOr::Item, ReferenceOr::Reference, RequestBody as OARequestBody, Response, Responses, Schema, @@ -172,15 +172,18 @@ pub trait GetOpenapi fn get_openapi(&mut self, path : &str); } -fn schema_to_content(schema : ReferenceOr) -> IndexMap +fn schema_to_content(types : Vec, schema : ReferenceOr) -> IndexMap { let mut content : IndexMap = IndexMap::new(); - content.insert(APPLICATION_JSON.to_string(), MediaType { - schema: Some(schema), - example: None, - examples: IndexMap::new(), - encoding: IndexMap::new() - }); + for ty in types + { + content.insert(ty.to_string(), MediaType { + schema: Some(schema.clone()), + example: None, + examples: IndexMap::new(), + encoding: IndexMap::new() + }); + } content } @@ -266,12 +269,9 @@ impl<'a> OperationParams<'a> } } -fn new_operation(default_status : hyper::StatusCode, schema : ReferenceOr, params : OperationParams, body_schema : Option>) -> Operation +fn new_operation(default_status : hyper::StatusCode, accepted_types : Option>, schema : ReferenceOr, params : OperationParams, body_schema : Option>, supported_types : Option>) -> Operation { - let content = match default_status.as_u16() { - 204 => IndexMap::new(), - _ => schema_to_content(schema) - }; + let content = schema_to_content(accepted_types.unwrap_or_default(), schema); let mut responses : IndexMap> = IndexMap::new(); responses.insert(StatusCode::Code(default_status.as_u16()), Item(Response { @@ -283,7 +283,7 @@ fn new_operation(default_status : hyper::StatusCode, schema : ReferenceOr() @@ -360,7 +360,7 @@ macro_rules! implOpenapiRouter { let path = format!("/{}/{{id}}", &self.1); let mut item = (self.0).1.remove_path(&path); - item.get = Some(new_operation(Res::default_status(), schema, OperationParams::from_path_params(vec!["id"]), None)); + item.get = Some(new_operation(Res::default_status(), Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), None, None)); (self.0).1.add_path(path, item); (&mut *(self.0).0, self.1.to_string()).read::() @@ -376,7 +376,7 @@ macro_rules! implOpenapiRouter { let path = format!("/{}/search", &self.1); let mut item = (self.0).1.remove_path(&self.1); - item.get = Some(new_operation(Res::default_status(), schema, OperationParams::from_query_params(Query::schema()), None)); + item.get = Some(new_operation(Res::default_status(), Res::accepted_types(), schema, OperationParams::from_query_params(Query::schema()), None, None)); (self.0).1.add_path(path, item); (&mut *(self.0).0, self.1.to_string()).search::() @@ -393,7 +393,7 @@ macro_rules! implOpenapiRouter { let path = format!("/{}", &self.1); let mut item = (self.0).1.remove_path(&path); - item.post = Some(new_operation(Res::default_status(), schema, OperationParams::default(), Some(body_schema))); + item.post = Some(new_operation(Res::default_status(), Res::accepted_types(), schema, OperationParams::default(), Some(body_schema), Body::supported_types())); (self.0).1.add_path(path, item); (&mut *(self.0).0, self.1.to_string()).create::() @@ -410,7 +410,7 @@ macro_rules! implOpenapiRouter { let path = format!("/{}", &self.1); let mut item = (self.0).1.remove_path(&path); - item.put = Some(new_operation(Res::default_status(), schema, OperationParams::default(), Some(body_schema))); + item.put = Some(new_operation(Res::default_status(), Res::accepted_types(), schema, OperationParams::default(), Some(body_schema), Body::supported_types())); (self.0).1.add_path(path, item); (&mut *(self.0).0, self.1.to_string()).update_all::() @@ -428,7 +428,7 @@ macro_rules! implOpenapiRouter { let path = format!("/{}/{{id}}", &self.1); let mut item = (self.0).1.remove_path(&path); - item.put = Some(new_operation(Res::default_status(), schema, OperationParams::from_path_params(vec!["id"]), Some(body_schema))); + item.put = Some(new_operation(Res::default_status(), Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), Some(body_schema), Body::supported_types())); (self.0).1.add_path(path, item); (&mut *(self.0).0, self.1.to_string()).update::() @@ -443,7 +443,7 @@ macro_rules! implOpenapiRouter { let path = format!("/{}", &self.1); let mut item = (self.0).1.remove_path(&path); - item.delete = Some(new_operation(Res::default_status(), schema, OperationParams::default(), None)); + item.delete = Some(new_operation(Res::default_status(), Res::accepted_types(), schema, OperationParams::default(), None, None)); (self.0).1.add_path(path, item); (&mut *(self.0).0, self.1.to_string()).delete_all::() @@ -459,7 +459,7 @@ macro_rules! implOpenapiRouter { let path = format!("/{}/{{id}}", &self.1); let mut item = (self.0).1.remove_path(&path); - item.delete = Some(new_operation(Res::default_status(), schema, OperationParams::from_path_params(vec!["id"]), None)); + item.delete = Some(new_operation(Res::default_status(), Res::accepted_types(), schema, OperationParams::from_path_params(vec!["id"]), None, None)); (self.0).1.add_path(path, item); (&mut *(self.0).0, self.1.to_string()).delete::()