pub mod oauth;
pub mod requirement;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::model::{extensions::Extensions, parameter::ParameterIn, security::oauth::OAuthFlows};
#[non_exhaustive]
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum SecurityScheme {
#[non_exhaustive]
#[serde(rename = "apiKey")]
ApiKey {
name: String,
#[serde(rename = "in")]
location: ParameterIn,
#[serde(default, skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[cfg(feature = "openapi32")]
#[serde(default, skip_serializing_if = "Option::is_none")]
deprecated: Option<bool>,
#[serde(flatten)]
extensions: Extensions,
},
#[non_exhaustive]
#[serde(rename = "http")]
Http {
scheme: String,
#[serde(
rename = "bearerFormat",
default,
skip_serializing_if = "Option::is_none"
)]
bearer_format: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[cfg(feature = "openapi32")]
#[serde(default, skip_serializing_if = "Option::is_none")]
deprecated: Option<bool>,
#[serde(flatten)]
extensions: Extensions,
},
#[non_exhaustive]
#[serde(rename = "mutualTLS")]
MutualTls {
#[serde(default, skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[cfg(feature = "openapi32")]
#[serde(default, skip_serializing_if = "Option::is_none")]
deprecated: Option<bool>,
#[serde(flatten)]
extensions: Extensions,
},
#[non_exhaustive]
#[serde(rename = "oauth2")]
OAuth2 {
flows: Box<OAuthFlows>,
#[cfg(feature = "openapi32")]
#[serde(
rename = "oauth2MetadataUrl",
default,
skip_serializing_if = "Option::is_none"
)]
oauth2_metadata_url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[cfg(feature = "openapi32")]
#[serde(default, skip_serializing_if = "Option::is_none")]
deprecated: Option<bool>,
#[serde(flatten)]
extensions: Extensions,
},
#[non_exhaustive]
#[serde(rename = "openIdConnect")]
OpenIdConnect {
#[serde(rename = "openIdConnectUrl")]
open_id_connect_url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[cfg(feature = "openapi32")]
#[serde(default, skip_serializing_if = "Option::is_none")]
deprecated: Option<bool>,
#[serde(flatten)]
extensions: Extensions,
},
}
impl SecurityScheme {
#[must_use]
pub fn http(scheme: impl Into<String>, bearer_format: Option<String>) -> Self {
Self::Http {
scheme: scheme.into(),
bearer_format,
description: None,
#[cfg(feature = "openapi32")]
deprecated: None,
extensions: Extensions::new(),
}
}
#[must_use]
pub fn bearer(bearer_format: Option<String>) -> Self {
Self::http("bearer", bearer_format)
}
#[must_use]
pub fn basic() -> Self {
Self::http("basic", None)
}
pub fn api_key_header(name: impl Into<String>) -> Self {
Self::ApiKey {
name: name.into(),
location: ParameterIn::Header,
description: None,
#[cfg(feature = "openapi32")]
deprecated: None,
extensions: Extensions::new(),
}
}
pub fn api_key_query(name: impl Into<String>) -> Self {
Self::ApiKey {
name: name.into(),
location: ParameterIn::Query,
description: None,
#[cfg(feature = "openapi32")]
deprecated: None,
extensions: Extensions::new(),
}
}
pub fn api_key_cookie(name: impl Into<String>) -> Self {
Self::ApiKey {
name: name.into(),
location: ParameterIn::Cookie,
description: None,
#[cfg(feature = "openapi32")]
deprecated: None,
extensions: Extensions::new(),
}
}
#[must_use]
pub fn mutual_tls() -> Self {
Self::MutualTls {
description: None,
#[cfg(feature = "openapi32")]
deprecated: None,
extensions: Extensions::new(),
}
}
#[must_use]
pub fn oauth2(flows: OAuthFlows) -> Self {
Self::OAuth2 {
flows: Box::new(flows),
#[cfg(feature = "openapi32")]
oauth2_metadata_url: None,
description: None,
#[cfg(feature = "openapi32")]
deprecated: None,
extensions: Extensions::new(),
}
}
pub fn open_id_connect(url: impl Into<String>) -> Self {
Self::OpenIdConnect {
open_id_connect_url: url.into(),
description: None,
#[cfg(feature = "openapi32")]
deprecated: None,
extensions: Extensions::new(),
}
}
#[must_use]
pub fn with_description(mut self, description: impl Into<String>) -> Self {
let slot = match &mut self {
Self::ApiKey { description, .. }
| Self::Http { description, .. }
| Self::MutualTls { description, .. }
| Self::OAuth2 { description, .. }
| Self::OpenIdConnect { description, .. } => description,
};
*slot = Some(description.into());
self
}
#[must_use]
pub fn with_extension(mut self, key: impl Into<String>, value: impl Into<Value>) -> Self {
let slot = match &mut self {
Self::ApiKey { extensions, .. }
| Self::Http { extensions, .. }
| Self::MutualTls { extensions, .. }
| Self::OAuth2 { extensions, .. }
| Self::OpenIdConnect { extensions, .. } => extensions,
};
slot.insert(key, value);
self
}
#[cfg(feature = "openapi32")]
#[must_use]
pub fn with_deprecated(mut self, deprecated: bool) -> Self {
let slot = match &mut self {
Self::ApiKey { deprecated, .. }
| Self::Http { deprecated, .. }
| Self::MutualTls { deprecated, .. }
| Self::OAuth2 { deprecated, .. }
| Self::OpenIdConnect { deprecated, .. } => deprecated,
};
*slot = Some(deprecated);
self
}
#[cfg(feature = "openapi32")]
#[must_use]
pub fn deprecate(mut self) -> Self {
let slot = match &mut self {
Self::ApiKey { deprecated, .. }
| Self::Http { deprecated, .. }
| Self::MutualTls { deprecated, .. }
| Self::OAuth2 { deprecated, .. }
| Self::OpenIdConnect { deprecated, .. } => deprecated,
};
*slot = Some(true);
self
}
#[cfg(feature = "openapi32")]
#[must_use]
pub fn with_oauth2_metadata_url(mut self, url: impl Into<String>) -> Self {
if let Self::OAuth2 {
oauth2_metadata_url,
..
} = &mut self
{
*oauth2_metadata_url = Some(url.into());
}
self
}
}
#[cfg(test)]
mod tests;