mirror of
https://gitlab.com/msrd0/gotham-restful.git
synced 2025-02-22 12:42:28 +00:00
fix ui when openapi is enabled
This commit is contained in:
parent
30edd349ed
commit
c640efcb88
9 changed files with 64 additions and 32 deletions
|
@ -1,4 +1,4 @@
|
|||
use crate::{OpenapiSchema, OpenapiType};
|
||||
use crate::OpenapiSchema;
|
||||
use indexmap::IndexMap;
|
||||
use openapiv3::{
|
||||
Components, OpenAPI, PathItem, ReferenceOr,
|
||||
|
@ -83,8 +83,7 @@ impl OpenapiBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn add_schema<T: OpenapiType>(&mut self) -> ReferenceOr<Schema> {
|
||||
let mut schema = T::schema();
|
||||
pub fn add_schema(&mut self, mut schema: OpenapiSchema) -> ReferenceOr<Schema> {
|
||||
match schema.name.clone() {
|
||||
Some(name) => {
|
||||
let reference = Reference {
|
||||
|
@ -105,6 +104,7 @@ impl OpenapiBuilder {
|
|||
#[allow(dead_code)]
|
||||
mod test {
|
||||
use super::*;
|
||||
use crate::OpenapiType;
|
||||
|
||||
#[derive(OpenapiType)]
|
||||
struct Message {
|
||||
|
@ -142,7 +142,7 @@ mod test {
|
|||
#[test]
|
||||
fn add_schema() {
|
||||
let mut builder = OpenapiBuilder::new(info());
|
||||
builder.add_schema::<Option<Messages>>();
|
||||
builder.add_schema(<Option<Messages>>::schema());
|
||||
let openapi = openapi(builder);
|
||||
|
||||
assert_eq!(
|
||||
|
|
|
@ -184,12 +184,11 @@ impl OperationDescription {
|
|||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
use crate::{OpenapiType, ResourceResult};
|
||||
|
||||
#[test]
|
||||
fn no_content_schema_to_content() {
|
||||
let types = NoContent::accepted_types();
|
||||
let schema = <NoContent as OpenapiType>::schema();
|
||||
let schema = <NoContent as ResourceResult>::schema();
|
||||
let content = OperationDescription::schema_to_content(types.or_all_types(), Item(schema.into_schema()));
|
||||
assert!(content.is_empty());
|
||||
}
|
||||
|
@ -197,7 +196,7 @@ mod test {
|
|||
#[test]
|
||||
fn raw_schema_to_content() {
|
||||
let types = Raw::<&str>::accepted_types();
|
||||
let schema = <Raw<&str> as OpenapiType>::schema();
|
||||
let schema = <Raw<&str> as ResourceResult>::schema();
|
||||
let content = OperationDescription::schema_to_content(types.or_all_types(), Item(schema.into_schema()));
|
||||
assert_eq!(content.len(), 1);
|
||||
let json = serde_json::to_string(&content.values().nth(0).unwrap()).unwrap();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
use super::{builder::OpenapiBuilder, handler::OpenapiHandler, operation::OperationDescription};
|
||||
use crate::{routing::*, EndpointWithSchema, OpenapiType, ResourceWithSchema};
|
||||
use crate::{routing::*, EndpointWithSchema, OpenapiType, ResourceResult, ResourceWithSchema};
|
||||
use gotham::{hyper::Method, pipeline::chain::PipelineHandleChain, router::builder::*};
|
||||
use once_cell::sync::Lazy;
|
||||
use regex::{Captures, Regex};
|
||||
|
@ -69,7 +69,7 @@ macro_rules! implOpenapiRouter {
|
|||
P: RefUnwindSafe + Send + Sync + 'static
|
||||
{
|
||||
fn endpoint<E: EndpointWithSchema + 'static>(&mut self) {
|
||||
let schema = (self.0).openapi_builder.add_schema::<E::Output>();
|
||||
let schema = (self.0).openapi_builder.add_schema(E::Output::schema());
|
||||
let mut descr = OperationDescription::new::<E>(schema);
|
||||
if E::has_placeholders() {
|
||||
descr.set_path_params(E::Placeholders::schema());
|
||||
|
@ -78,7 +78,7 @@ macro_rules! implOpenapiRouter {
|
|||
descr.set_query_params(E::Params::schema());
|
||||
}
|
||||
if E::needs_body() {
|
||||
let body_schema = (self.0).openapi_builder.add_schema::<E::Body>();
|
||||
let body_schema = (self.0).openapi_builder.add_schema(E::Body::schema());
|
||||
descr.set_body::<E::Body>(body_schema);
|
||||
}
|
||||
|
||||
|
|
|
@ -65,13 +65,6 @@ pub trait ResourceResult {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "openapi")]
|
||||
impl<Res: ResourceResult> crate::OpenapiType for Res {
|
||||
fn schema() -> OpenapiSchema {
|
||||
Self::schema()
|
||||
}
|
||||
}
|
||||
|
||||
/// The default json returned on an 500 Internal Server Error.
|
||||
#[derive(Debug, Serialize)]
|
||||
pub(crate) struct ResourceError {
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use super::{handle_error, IntoResponseError, ResourceResult};
|
||||
#[cfg(feature = "openapi")]
|
||||
use crate::OpenapiSchema;
|
||||
use crate::{FromBody, RequestBody, ResourceType, Response};
|
||||
#[cfg(feature = "openapi")]
|
||||
use crate::{OpenapiSchema, OpenapiType};
|
||||
|
||||
use futures_core::future::Future;
|
||||
use futures_util::{future, future::FutureExt};
|
||||
|
@ -89,6 +89,16 @@ impl<T: for<'a> From<&'a [u8]>> FromBody for Raw<T> {
|
|||
|
||||
impl<T> RequestBody for Raw<T> where Raw<T>: FromBody + ResourceType {}
|
||||
|
||||
#[cfg(feature = "openapi")]
|
||||
impl<T> OpenapiType for Raw<T> {
|
||||
fn schema() -> OpenapiSchema {
|
||||
OpenapiSchema::new(SchemaKind::Type(Type::String(StringType {
|
||||
format: VariantOrUnknownOrEmpty::Item(StringFormat::Binary),
|
||||
..Default::default()
|
||||
})))
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Into<Body>> ResourceResult for Raw<T>
|
||||
where
|
||||
Self: Send
|
||||
|
@ -101,10 +111,7 @@ where
|
|||
|
||||
#[cfg(feature = "openapi")]
|
||||
fn schema() -> OpenapiSchema {
|
||||
OpenapiSchema::new(SchemaKind::Type(Type::String(StringType {
|
||||
format: VariantOrUnknownOrEmpty::Item(StringFormat::Binary),
|
||||
..Default::default()
|
||||
})))
|
||||
<Self as OpenapiType>::schema()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,14 @@
|
|||
error[E0277]: the trait bound `FooBody: OpenapiType` is not satisfied
|
||||
--> $DIR/invalid_body_ty.rs:15:16
|
||||
|
|
||||
15 | fn endpoint(_: FooBody) {
|
||||
| ^^^^^^^ the trait `OpenapiType` is not implemented for `FooBody`
|
||||
|
|
||||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Body: RequestBody + Send;
|
||||
| ----------- required by this bound in `gotham_restful::EndpointWithSchema::Body`
|
||||
|
||||
error[E0277]: the trait bound `for<'de> FooBody: serde::de::Deserialize<'de>` is not satisfied
|
||||
--> $DIR/invalid_body_ty.rs:15:16
|
||||
|
|
||||
|
@ -7,7 +18,7 @@ error[E0277]: the trait bound `for<'de> FooBody: serde::de::Deserialize<'de>` is
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Body: RequestBody + Send;
|
||||
| ----------- required by this bound in `gotham_restful::Endpoint::Body`
|
||||
| ----------- required by this bound in `gotham_restful::EndpointWithSchema::Body`
|
||||
|
|
||||
= note: required because of the requirements on the impl of `serde::de::DeserializeOwned` for `FooBody`
|
||||
= note: required because of the requirements on the impl of `RequestBody` for `FooBody`
|
||||
= note: required because of the requirements on the impl of `gotham_restful::RequestBody` for `FooBody`
|
||||
|
|
|
@ -7,7 +7,7 @@ error[E0277]: the trait bound `for<'de> FooParams: serde::de::Deserialize<'de>`
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Params: QueryStringExtractor<Body> + Sync;
|
||||
| -------------------------- required by this bound in `gotham_restful::Endpoint::Params`
|
||||
| -------------------------- required by this bound in `gotham_restful::EndpointWithSchema::Params`
|
||||
|
||||
error[E0277]: the trait bound `FooParams: StateData` is not satisfied
|
||||
--> $DIR/invalid_params_ty.rs:15:16
|
||||
|
@ -18,7 +18,7 @@ error[E0277]: the trait bound `FooParams: StateData` is not satisfied
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Params: QueryStringExtractor<Body> + Sync;
|
||||
| -------------------------- required by this bound in `gotham_restful::Endpoint::Params`
|
||||
| -------------------------- required by this bound in `gotham_restful::EndpointWithSchema::Params`
|
||||
|
||||
error[E0277]: the trait bound `FooParams: StaticResponseExtender` is not satisfied
|
||||
--> $DIR/invalid_params_ty.rs:15:16
|
||||
|
@ -29,4 +29,15 @@ error[E0277]: the trait bound `FooParams: StaticResponseExtender` is not satisfi
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Params: QueryStringExtractor<Body> + Sync;
|
||||
| -------------------------- required by this bound in `gotham_restful::Endpoint::Params`
|
||||
| -------------------------- required by this bound in `gotham_restful::EndpointWithSchema::Params`
|
||||
|
||||
error[E0277]: the trait bound `FooParams: OpenapiType` is not satisfied
|
||||
--> $DIR/invalid_params_ty.rs:15:16
|
||||
|
|
||||
15 | fn endpoint(_: FooParams) {
|
||||
| ^^^^^^^^^ the trait `OpenapiType` is not implemented for `FooParams`
|
||||
|
|
||||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| #[openapi_bound("Params: crate::OpenapiType")]
|
||||
| ---------------------------- required by this bound in `gotham_restful::EndpointWithSchema::Params`
|
||||
|
|
|
@ -7,7 +7,7 @@ error[E0277]: the trait bound `for<'de> FooPlaceholders: serde::de::Deserialize<
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Placeholders: PathExtractor<Body> + Sync;
|
||||
| ------------------- required by this bound in `gotham_restful::Endpoint::Placeholders`
|
||||
| ------------------- required by this bound in `gotham_restful::EndpointWithSchema::Placeholders`
|
||||
|
||||
error[E0277]: the trait bound `FooPlaceholders: StateData` is not satisfied
|
||||
--> $DIR/invalid_placeholders_ty.rs:15:16
|
||||
|
@ -18,7 +18,7 @@ error[E0277]: the trait bound `FooPlaceholders: StateData` is not satisfied
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Placeholders: PathExtractor<Body> + Sync;
|
||||
| ------------------- required by this bound in `gotham_restful::Endpoint::Placeholders`
|
||||
| ------------------- required by this bound in `gotham_restful::EndpointWithSchema::Placeholders`
|
||||
|
||||
error[E0277]: the trait bound `FooPlaceholders: StaticResponseExtender` is not satisfied
|
||||
--> $DIR/invalid_placeholders_ty.rs:15:16
|
||||
|
@ -29,4 +29,15 @@ error[E0277]: the trait bound `FooPlaceholders: StaticResponseExtender` is not s
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Placeholders: PathExtractor<Body> + Sync;
|
||||
| ------------------- required by this bound in `gotham_restful::Endpoint::Placeholders`
|
||||
| ------------------- required by this bound in `gotham_restful::EndpointWithSchema::Placeholders`
|
||||
|
||||
error[E0277]: the trait bound `FooPlaceholders: OpenapiType` is not satisfied
|
||||
--> $DIR/invalid_placeholders_ty.rs:15:16
|
||||
|
|
||||
15 | fn endpoint(_: FooPlaceholders) {
|
||||
| ^^^^^^^^^^^^^^^ the trait `OpenapiType` is not implemented for `FooPlaceholders`
|
||||
|
|
||||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| #[openapi_bound("Placeholders: crate::OpenapiType")]
|
||||
| ---------------------------------- required by this bound in `gotham_restful::EndpointWithSchema::Placeholders`
|
||||
|
|
|
@ -7,4 +7,4 @@ error[E0277]: the trait bound `FooResponse: ResourceResult` is not satisfied
|
|||
::: $WORKSPACE/src/endpoint.rs
|
||||
|
|
||||
| type Output: ResourceResult + Send;
|
||||
| -------------- required by this bound in `gotham_restful::Endpoint::Output`
|
||||
| -------------- required by this bound in `gotham_restful::EndpointWithSchema::Output`
|
||||
|
|
Loading…
Add table
Reference in a new issue