From b12a72eb81ecf8e2271837b6023ec4969b53116c Mon Sep 17 00:00:00 2001 From: Chrislearn Young Date: Mon, 27 Nov 2023 08:31:57 +0800 Subject: [PATCH] oapi: Add extensions "x-tokenName" (#514) * oapi: Add extensions "x-tokenName" * Format Rust code using rustfmt --------- Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- crates/compression/src/lib.rs | 21 ++++++++++----------- crates/oapi/src/openapi/info.rs | 6 ++++++ crates/oapi/src/openapi/operation.rs | 6 +++++- crates/oapi/src/openapi/parameter.rs | 14 ++++++++++++++ crates/oapi/src/openapi/response.rs | 6 +++++- crates/oapi/src/openapi/security.rs | 11 ++++++++++- crates/oapi/src/openapi/tag.rs | 5 +++++ crates/serve-static/src/dir.rs | 18 +++++++++--------- 8 files changed, 64 insertions(+), 23 deletions(-) diff --git a/crates/compression/src/lib.rs b/crates/compression/src/lib.rs index a683f422c..35b861096 100644 --- a/crates/compression/src/lib.rs +++ b/crates/compression/src/lib.rs @@ -35,8 +35,8 @@ pub enum CompressionLevel { } /// CompressionAlgo -#[derive(Eq, PartialEq, Clone, Copy, Debug, Hash)] #[non_exhaustive] +#[derive(Eq, PartialEq, Clone, Copy, Debug, Hash)] pub enum CompressionAlgo { #[cfg(feature = "brotli")] #[cfg_attr(docsrs, doc(cfg(feature = "brotli")))] @@ -61,18 +61,18 @@ impl FromStr for CompressionAlgo { fn from_str(s: &str) -> Result { match s { #[cfg(feature = "brotli")] - "br" => Ok(CompressionAlgo::Brotli), + "br" => Ok(Self::Brotli), #[cfg(feature = "brotli")] - "brotli" => Ok(CompressionAlgo::Brotli), + "brotli" => Ok(Self::Brotli), #[cfg(feature = "deflate")] - "deflate" => Ok(CompressionAlgo::Deflate), + "deflate" => Ok(Self::Deflate), #[cfg(feature = "gzip")] - "gzip" => Ok(CompressionAlgo::Gzip), + "gzip" => Ok(Self::Gzip), #[cfg(feature = "zstd")] - "zstd" => Ok(CompressionAlgo::Zstd), + "zstd" => Ok(Self::Zstd), _ => Err(format!("unknown compression algorithm: {s}")), } } @@ -82,14 +82,13 @@ impl Display for CompressionAlgo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { #[cfg(feature = "brotli")] - CompressionAlgo::Brotli => write!(f, "br"), + Self::Brotli => write!(f, "br"), #[cfg(feature = "deflate")] - CompressionAlgo::Deflate => write!(f, "deflate"), + Self::Deflate => write!(f, "deflate"), #[cfg(feature = "gzip")] - CompressionAlgo::Gzip => write!(f, "gzip"), + Self::Gzip => write!(f, "gzip"), #[cfg(feature = "zstd")] - CompressionAlgo::Zstd => write!(f, "zstd"), - _ => unreachable!(), + Self::Zstd => write!(f, "zstd"), } } } diff --git a/crates/oapi/src/openapi/info.rs b/crates/oapi/src/openapi/info.rs index 070a72274..3c5455afe 100644 --- a/crates/oapi/src/openapi/info.rs +++ b/crates/oapi/src/openapi/info.rs @@ -6,6 +6,8 @@ //! [info]: //! [openapi_trait]: ../../trait.OpenApi.html //! [derive]: ../../derive.OpenApi.html +use std::collections::HashMap; + use serde::{Deserialize, Serialize}; /// # Examples @@ -54,6 +56,10 @@ pub struct Info { /// Document version typically the API version. pub version: String, + + /// Optional extensions "x-something" + #[serde(skip_serializing_if = "Option::is_none", flatten)] + pub extensions: Option>, } impl Info { diff --git a/crates/oapi/src/openapi/operation.rs b/crates/oapi/src/openapi/operation.rs index a3fa191d3..431d944b1 100644 --- a/crates/oapi/src/openapi/operation.rs +++ b/crates/oapi/src/openapi/operation.rs @@ -1,7 +1,7 @@ //! Implements [OpenAPI Operation Object][operation] types. //! //! [operation]: https://spec.openapis.org/oas/latest.html#operation-object -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; use std::ops::{Deref, DerefMut}; use serde::{Deserialize, Serialize}; @@ -156,6 +156,10 @@ pub struct Operation { /// Alternative [`Server`]s for this [`Operation`]. #[serde(skip_serializing_if = "Servers::is_empty")] pub servers: Servers, + + /// Optional extensions "x-something" + #[serde(skip_serializing_if = "Option::is_none", flatten)] + pub extensions: Option>, } impl Operation { diff --git a/crates/oapi/src/openapi/parameter.rs b/crates/oapi/src/openapi/parameter.rs index 6197b5c5c..69df00333 100644 --- a/crates/oapi/src/openapi/parameter.rs +++ b/crates/oapi/src/openapi/parameter.rs @@ -1,6 +1,8 @@ //! Implements [OpenAPI Parameter Object][parameter] types. //! //! [parameter]: https://spec.openapis.org/oas/latest.html#parameter-object +use std::collections::HashMap; + use serde::{Deserialize, Serialize}; use serde_json::Value; @@ -137,6 +139,10 @@ pub struct Parameter { /// within [`Parameter::schema`] if defined. #[serde(skip_serializing_if = "Option::is_none")] example: Option, + + /// Optional extensions "x-something" + #[serde(skip_serializing_if = "Option::is_none", flatten)] + pub extensions: Option>, } impl Parameter { @@ -176,6 +182,7 @@ impl Parameter { explode, allow_reserved, example, + extensions, } = other; if name != self.name || parameter_in != self.parameter_in { return false; @@ -206,6 +213,13 @@ impl Parameter { if let Some(example) = example { self.example = Some(example); } + if let Some(extensions) = extensions { + if self.extensions.is_none() { + self.extensions = Some(HashMap::new()); + } else { + self.extensions.as_mut().unwrap().extend(extensions); + } + } true } diff --git a/crates/oapi/src/openapi/response.rs b/crates/oapi/src/openapi/response.rs index 91daa6f86..e353bb999 100644 --- a/crates/oapi/src/openapi/response.rs +++ b/crates/oapi/src/openapi/response.rs @@ -1,7 +1,7 @@ //! Implements [OpenApi Responses][responses]. //! //! [responses]: https://spec.openapis.org/oas/latest.html#responses-object -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; use std::ops::{Deref, DerefMut}; use indexmap::IndexMap; @@ -144,6 +144,10 @@ pub struct Response { #[serde(skip_serializing_if = "IndexMap::is_empty", default)] #[serde(rename = "content")] pub contents: IndexMap, + + /// Optional extensions "x-something" + #[serde(skip_serializing_if = "Option::is_none", flatten)] + pub extensions: Option>, } impl Response { diff --git a/crates/oapi/src/openapi/security.rs b/crates/oapi/src/openapi/security.rs index aeab42879..420aa8461 100644 --- a/crates/oapi/src/openapi/security.rs +++ b/crates/oapi/src/openapi/security.rs @@ -3,7 +3,10 @@ //! Refer to [`SecurityScheme`] for usage and more details. //! //! [security]: https://spec.openapis.org/oas/latest.html#security-scheme-object -use std::{collections::BTreeMap, iter}; +use std::{ + collections::{BTreeMap, HashMap}, + iter, +}; use serde::{Deserialize, Serialize}; @@ -334,6 +337,10 @@ pub struct OAuth2 { /// Optional description for the [`OAuth2`] [`Flow`] [`SecurityScheme`]. #[serde(skip_serializing_if = "Option::is_none")] pub description: Option, + + /// Optional extensions "x-something" + #[serde(skip_serializing_if = "Option::is_none", flatten)] + pub extensions: Option>, } impl OAuth2 { @@ -374,6 +381,7 @@ impl OAuth2 { .map(|auth_flow| (String::from(auth_flow.get_type_as_str()), auth_flow)), ), description: None, + extensions: None, } } @@ -413,6 +421,7 @@ impl OAuth2 { .map(|auth_flow| (String::from(auth_flow.get_type_as_str()), auth_flow)), ), description: Some(description.into()), + extensions: None, } } } diff --git a/crates/oapi/src/openapi/tag.rs b/crates/oapi/src/openapi/tag.rs index d4e7d799a..683b79f09 100644 --- a/crates/oapi/src/openapi/tag.rs +++ b/crates/oapi/src/openapi/tag.rs @@ -2,6 +2,7 @@ //! //! [tag]: https://spec.openapis.org/oas/latest.html#tag-object use std::cmp::{Ord, Ordering, PartialOrd}; +use std::collections::HashMap; use serde::{Deserialize, Serialize}; @@ -26,6 +27,10 @@ pub struct Tag { /// Additional external documentation for the tag. #[serde(skip_serializing_if = "Option::is_none")] pub external_docs: Option, + + /// Optional extensions "x-something" + #[serde(skip_serializing_if = "Option::is_none", flatten)] + pub extensions: Option>, } impl Ord for Tag { fn cmp(&self, other: &Self) -> Ordering { diff --git a/crates/serve-static/src/dir.rs b/crates/serve-static/src/dir.rs index ca591a34a..590fed487 100644 --- a/crates/serve-static/src/dir.rs +++ b/crates/serve-static/src/dir.rs @@ -37,11 +37,11 @@ impl FromStr for CompressionAlgo { fn from_str(s: &str) -> Result { match s { - "br" => Ok(CompressionAlgo::Brotli), - "brotli" => Ok(CompressionAlgo::Brotli), - "deflate" => Ok(CompressionAlgo::Deflate), - "gzip" => Ok(CompressionAlgo::Gzip), - "zstd" => Ok(CompressionAlgo::Zstd), + "br" => Ok(Self::Brotli), + "brotli" => Ok(Self::Brotli), + "deflate" => Ok(Self::Deflate), + "gzip" => Ok(Self::Gzip), + "zstd" => Ok(Self::Zstd), _ => Err(format!("unknown compression algorithm: {s}")), } } @@ -50,10 +50,10 @@ impl FromStr for CompressionAlgo { impl Display for CompressionAlgo { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - CompressionAlgo::Brotli => write!(f, "br"), - CompressionAlgo::Deflate => write!(f, "deflate"), - CompressionAlgo::Gzip => write!(f, "gzip"), - CompressionAlgo::Zstd => write!(f, "zstd"), + Self::Brotli => write!(f, "br"), + Self::Deflate => write!(f, "deflate"), + Self::Gzip => write!(f, "gzip"), + Self::Zstd => write!(f, "zstd"), } } }