mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-02-23 13:02:28 +00:00
add openapi for other methods, so far without request bodies
This commit is contained in:
parent
7286054a2f
commit
389740cd64
1 changed files with 53 additions and 8 deletions
|
@ -17,8 +17,8 @@ use log::error;
|
||||||
use mime::{APPLICATION_JSON, TEXT_PLAIN};
|
use mime::{APPLICATION_JSON, TEXT_PLAIN};
|
||||||
use openapiv3::{
|
use openapiv3::{
|
||||||
Components, MediaType, OpenAPI, Operation, Parameter, ParameterData, ParameterSchemaOrContent, PathItem,
|
Components, MediaType, OpenAPI, Operation, Parameter, ParameterData, ParameterSchemaOrContent, PathItem,
|
||||||
PathStyle, Paths, ReferenceOr, ReferenceOr::Item, ReferenceOr::Reference, Response, Responses, Schema,
|
PathStyle, Paths, ReferenceOr, ReferenceOr::Item, ReferenceOr::Reference, RequestBody, Response, Responses,
|
||||||
SchemaData, Server, StatusCode
|
Schema, SchemaData, Server, StatusCode
|
||||||
};
|
};
|
||||||
use serde::de::DeserializeOwned;
|
use serde::de::DeserializeOwned;
|
||||||
use std::panic::RefUnwindSafe;
|
use std::panic::RefUnwindSafe;
|
||||||
|
@ -147,7 +147,7 @@ pub trait GetOpenapi
|
||||||
fn get_openapi(&mut self, path : &str);
|
fn get_openapi(&mut self, path : &str);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_operation(schema : &str, path_params : Vec<&str>) -> Operation
|
fn schema_to_content(schema : &str) -> IndexMap<String, MediaType>
|
||||||
{
|
{
|
||||||
let mut content : IndexMap<String, MediaType> = IndexMap::new();
|
let mut content : IndexMap<String, MediaType> = IndexMap::new();
|
||||||
content.insert(APPLICATION_JSON.to_string(), MediaType {
|
content.insert(APPLICATION_JSON.to_string(), MediaType {
|
||||||
|
@ -158,12 +158,16 @@ fn new_operation(schema : &str, path_params : Vec<&str>) -> Operation
|
||||||
examples: IndexMap::new(),
|
examples: IndexMap::new(),
|
||||||
encoding: IndexMap::new()
|
encoding: IndexMap::new()
|
||||||
});
|
});
|
||||||
|
content
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_operation(schema : &str, path_params : Vec<&str>, body_schema : Option<&str>) -> Operation
|
||||||
|
{
|
||||||
let mut responses : IndexMap<StatusCode, ReferenceOr<Response>> = IndexMap::new();
|
let mut responses : IndexMap<StatusCode, ReferenceOr<Response>> = IndexMap::new();
|
||||||
responses.insert(StatusCode::Code(200), Item(Response {
|
responses.insert(StatusCode::Code(200), Item(Response {
|
||||||
description: "OK".to_string(),
|
description: "OK".to_string(),
|
||||||
headers: IndexMap::new(),
|
headers: IndexMap::new(),
|
||||||
content,
|
content: schema_to_content(schema),
|
||||||
links: IndexMap::new()
|
links: IndexMap::new()
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
@ -187,6 +191,12 @@ fn new_operation(schema : &str, path_params : Vec<&str>) -> Operation
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let request_body = body_schema.map(|schema| Item(RequestBody {
|
||||||
|
description: None,
|
||||||
|
content: schema_to_content(schema),
|
||||||
|
required: true
|
||||||
|
}));
|
||||||
|
|
||||||
Operation {
|
Operation {
|
||||||
tags: Vec::new(),
|
tags: Vec::new(),
|
||||||
summary: None,
|
summary: None,
|
||||||
|
@ -194,7 +204,7 @@ fn new_operation(schema : &str, path_params : Vec<&str>) -> Operation
|
||||||
external_documentation: None,
|
external_documentation: None,
|
||||||
operation_id: None, // TODO
|
operation_id: None, // TODO
|
||||||
parameters: params,
|
parameters: params,
|
||||||
request_body: None,
|
request_body,
|
||||||
responses: Responses {
|
responses: Responses {
|
||||||
default: None,
|
default: None,
|
||||||
responses
|
responses
|
||||||
|
@ -244,7 +254,7 @@ macro_rules! implOpenapiRouter {
|
||||||
|
|
||||||
let path = format!("/{}", &self.1);
|
let path = format!("/{}", &self.1);
|
||||||
let mut item = (self.0).1.remove_path(&path);
|
let mut item = (self.0).1.remove_path(&path);
|
||||||
item.get = Some(new_operation(&schema, vec![]));
|
item.get = Some(new_operation(&schema, vec![], None));
|
||||||
(self.0).1.add_path(path, item);
|
(self.0).1.add_path(path, item);
|
||||||
|
|
||||||
(&mut *(self.0).0, self.1.to_string()).read_all::<Handler, Res>()
|
(&mut *(self.0).0, self.1.to_string()).read_all::<Handler, Res>()
|
||||||
|
@ -260,7 +270,7 @@ macro_rules! implOpenapiRouter {
|
||||||
|
|
||||||
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).1.remove_path(&path);
|
||||||
item.get = Some(new_operation(&schema, vec!["id"]));
|
item.get = Some(new_operation(&schema, vec!["id"], None));
|
||||||
(self.0).1.add_path(path, item);
|
(self.0).1.add_path(path, item);
|
||||||
|
|
||||||
(&mut *(self.0).0, self.1.to_string()).read::<Handler, ID, Res>()
|
(&mut *(self.0).0, self.1.to_string()).read::<Handler, ID, Res>()
|
||||||
|
@ -272,6 +282,13 @@ macro_rules! implOpenapiRouter {
|
||||||
Res : ResourceResult,
|
Res : ResourceResult,
|
||||||
Handler : ResourceCreate<Body, Res>
|
Handler : ResourceCreate<Body, Res>
|
||||||
{
|
{
|
||||||
|
let schema = (self.0).1.add_schema::<Res>(&self.1, "create", "result_body");
|
||||||
|
|
||||||
|
let path = format!("/{}", &self.1);
|
||||||
|
let mut item = (self.0).1.remove_path(&path);
|
||||||
|
item.post = Some(new_operation(&schema, vec![], None));
|
||||||
|
(self.0).1.add_path(path, item);
|
||||||
|
|
||||||
(&mut *(self.0).0, self.1.to_string()).create::<Handler, Body, Res>()
|
(&mut *(self.0).0, self.1.to_string()).create::<Handler, Body, Res>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -281,6 +298,13 @@ macro_rules! implOpenapiRouter {
|
||||||
Res : ResourceResult,
|
Res : ResourceResult,
|
||||||
Handler : ResourceUpdateAll<Body, Res>
|
Handler : ResourceUpdateAll<Body, Res>
|
||||||
{
|
{
|
||||||
|
let schema = (self.0).1.add_schema::<Res>(&self.1, "update_all", "result_body");
|
||||||
|
|
||||||
|
let path = format!("/{}", &self.1);
|
||||||
|
let mut item = (self.0).1.remove_path(&path);
|
||||||
|
item.put = Some(new_operation(&schema, vec![], None));
|
||||||
|
(self.0).1.add_path(path, item);
|
||||||
|
|
||||||
(&mut *(self.0).0, self.1.to_string()).update_all::<Handler, Body, Res>()
|
(&mut *(self.0).0, self.1.to_string()).update_all::<Handler, Body, Res>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,6 +315,13 @@ macro_rules! implOpenapiRouter {
|
||||||
Res : ResourceResult,
|
Res : ResourceResult,
|
||||||
Handler : ResourceUpdate<ID, Body, Res>
|
Handler : ResourceUpdate<ID, Body, Res>
|
||||||
{
|
{
|
||||||
|
let schema = (self.0).1.add_schema::<Res>(&self.1, "update", "result_body");
|
||||||
|
|
||||||
|
let path = format!("/{}/{{id}}", &self.1);
|
||||||
|
let mut item = (self.0).1.remove_path(&path);
|
||||||
|
item.put = Some(new_operation(&schema, vec!["id"], None));
|
||||||
|
(self.0).1.add_path(path, item);
|
||||||
|
|
||||||
(&mut *(self.0).0, self.1.to_string()).update::<Handler, ID, Body, Res>()
|
(&mut *(self.0).0, self.1.to_string()).update::<Handler, ID, Body, Res>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,6 +330,13 @@ macro_rules! implOpenapiRouter {
|
||||||
Res : ResourceResult,
|
Res : ResourceResult,
|
||||||
Handler : ResourceDeleteAll<Res>
|
Handler : ResourceDeleteAll<Res>
|
||||||
{
|
{
|
||||||
|
let schema = (self.0).1.add_schema::<Res>(&self.1, "delete_all", "result_body");
|
||||||
|
|
||||||
|
let path = format!("/{}", &self.1);
|
||||||
|
let mut item = (self.0).1.remove_path(&path);
|
||||||
|
item.delete = Some(new_operation(&schema, vec![], None));
|
||||||
|
(self.0).1.add_path(path, item);
|
||||||
|
|
||||||
(&mut *(self.0).0, self.1.to_string()).delete_all::<Handler, Res>()
|
(&mut *(self.0).0, self.1.to_string()).delete_all::<Handler, Res>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -308,6 +346,13 @@ macro_rules! implOpenapiRouter {
|
||||||
Res : ResourceResult,
|
Res : ResourceResult,
|
||||||
Handler : ResourceDelete<ID, Res>
|
Handler : ResourceDelete<ID, Res>
|
||||||
{
|
{
|
||||||
|
let schema = (self.0).1.add_schema::<Res>(&self.1, "delete", "result_body");
|
||||||
|
|
||||||
|
let path = format!("/{}/{{id}}", &self.1);
|
||||||
|
let mut item = (self.0).1.remove_path(&path);
|
||||||
|
item.delete = Some(new_operation(&schema, vec!["id"], None));
|
||||||
|
(self.0).1.add_path(path, item);
|
||||||
|
|
||||||
(&mut *(self.0).0, self.1.to_string()).delete::<Handler, ID, Res>()
|
(&mut *(self.0).0, self.1.to_string()).delete::<Handler, ID, Res>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue