use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum SecurityScheme {
#[serde(rename = "userPassword")]
UserPassword {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "apiKey")]
ApiKey {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(rename = "in")]
location: String,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
X509 {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "symmetricEncryption")]
SymmetricEncryption {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "asymmetricEncryption")]
AsymmetricEncryption {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "httpApiKey")]
HttpApiKey {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
name: String,
#[serde(rename = "in")]
location: String,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "http", rename_all = "camelCase")]
Http {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
scheme: String,
#[serde(skip_serializing_if = "Option::is_none")]
bearer_format: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "oauth2")]
OAuth2 {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
flows: OAuthFlows,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "openIdConnect", rename_all = "camelCase")]
OpenIdConnect {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
open_id_connect_url: String,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "plain")]
Plain {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "scramSha256")]
ScramSha256 {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "scramSha512")]
ScramSha512 {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
#[serde(rename = "gssapi")]
Gssapi {
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
#[serde(flatten)]
extensions: IndexMap<String, serde_json::Value>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct OAuthFlows {
#[serde(skip_serializing_if = "Option::is_none")]
pub implicit: Option<OAuthFlowImplicit>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<OAuthFlowPassword>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_credentials: Option<OAuthFlowClientCredentials>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_code: Option<OAuthFlowAuthorizationCode>,
#[serde(flatten)]
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct OAuthFlowImplicit {
pub authorization_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub refresh_url: Option<String>,
pub scopes: IndexMap<String, String>,
#[serde(flatten)]
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct OAuthFlowPassword {
pub token_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub refresh_url: Option<String>,
pub scopes: IndexMap<String, String>,
#[serde(flatten)]
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct OAuthFlowClientCredentials {
pub token_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub refresh_url: Option<String>,
pub scopes: IndexMap<String, String>,
#[serde(flatten)]
pub extensions: IndexMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct OAuthFlowAuthorizationCode {
pub authorization_url: String,
pub token_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub refresh_url: Option<String>,
pub scopes: IndexMap<String, String>,
#[serde(flatten)]
pub extensions: IndexMap<String, serde_json::Value>,
}
#[test]
fn test_deserialize_security_scheme() {
use crate::ReferenceOr;
let example = r#"
type: apiKey
in: user
description: Provide your API key as the user and leave the password empty.
"#;
let asyncapi: ReferenceOr<SecurityScheme> = serde_yaml::from_str(example)
.expect(&format!("Could not deserialize api key security scheme"));
assert_eq!(
ReferenceOr::Item(SecurityScheme::ApiKey {
location: "user".to_string(),
description: Some(
"Provide your API key as the user and leave the password empty.".to_string(),
),
extensions: Default::default(),
}),
asyncapi
);
}