From de7c3cb015dae95f1a1a824d41da3a270bbfd846 Mon Sep 17 00:00:00 2001 From: Dominic Date: Mon, 14 Oct 2019 14:59:41 +0200 Subject: [PATCH] infer query parameters into openapi spec --- gotham_restful/src/openapi/router.rs | 42 +++++++++++++++++++++------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/gotham_restful/src/openapi/router.rs b/gotham_restful/src/openapi/router.rs index cd40590..39ae602 100644 --- a/gotham_restful/src/openapi/router.rs +++ b/gotham_restful/src/openapi/router.rs @@ -21,8 +21,8 @@ use log::error; use mime::{APPLICATION_JSON, TEXT_PLAIN}; use openapiv3::{ Components, MediaType, OpenAPI, Operation, Parameter, ParameterData, ParameterSchemaOrContent, PathItem, - PathStyle, Paths, ReferenceOr, ReferenceOr::Item, ReferenceOr::Reference, RequestBody, Response, Responses, - Schema, Server, StatusCode + Paths, ReferenceOr, ReferenceOr::Item, ReferenceOr::Reference, RequestBody, Response, Responses, Schema, + SchemaKind, Server, StatusCode, Type }; use serde::de::DeserializeOwned; use std::panic::RefUnwindSafe; @@ -221,24 +221,46 @@ impl<'a> OperationParams<'a> example: None, examples: IndexMap::new() }, - style: PathStyle::default(), + style: Default::default(), })); } } - fn add_query_params(&self, params : &mut Vec>) + fn add_query_params(self, params : &mut Vec>) { - let query_params = match &self.query_params { - Some(qp) => qp, + let query_params = match self.query_params { + Some(qp) => qp.schema, None => return }; - // TODO + let query_params = match query_params { + SchemaKind::Type(Type::Object(ty)) => ty, + _ => panic!("Query Parameters needs to be a plain struct") + }; + for (name, schema) in query_params.properties + { + let required = query_params.required.contains(&name); + params.push(Item(Parameter::Query { + parameter_data: ParameterData { + name, + description: None, + required, + deprecated: None, + format: ParameterSchemaOrContent::Schema(schema.unbox()), + example: None, + examples: IndexMap::new() + }, + allow_reserved: false, + style: Default::default(), + allow_empty_value: None + })) + } } - fn params(&self) -> Vec> + fn into_params(self) -> Vec> { let mut params : Vec> = Vec::new(); self.add_path_params(&mut params); + self.add_query_params(&mut params); params } } @@ -270,7 +292,7 @@ fn new_operation(default_status : hyper::StatusCode, schema : ReferenceOr()