Skip to main content

oag_core/parse/
security.rs

1use indexmap::IndexMap;
2use serde::{Deserialize, Serialize};
3
4/// A security scheme type.
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
6#[serde(rename_all = "camelCase")]
7pub enum SecuritySchemeType {
8    ApiKey,
9    Http,
10    OAuth2,
11    OpenIdConnect,
12    MutualTLS,
13}
14
15/// Location of an API key.
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
17#[serde(rename_all = "lowercase")]
18pub enum ApiKeyLocation {
19    Query,
20    Header,
21    Cookie,
22}
23
24/// OAuth2 flows configuration.
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
26pub struct OAuthFlows {
27    #[serde(skip_serializing_if = "Option::is_none")]
28    pub implicit: Option<OAuthFlow>,
29    #[serde(skip_serializing_if = "Option::is_none")]
30    pub password: Option<OAuthFlow>,
31    #[serde(rename = "clientCredentials", skip_serializing_if = "Option::is_none")]
32    pub client_credentials: Option<OAuthFlow>,
33    #[serde(rename = "authorizationCode", skip_serializing_if = "Option::is_none")]
34    pub authorization_code: Option<OAuthFlow>,
35}
36
37/// A single OAuth2 flow.
38#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
39pub struct OAuthFlow {
40    #[serde(rename = "authorizationUrl", skip_serializing_if = "Option::is_none")]
41    pub authorization_url: Option<String>,
42    #[serde(rename = "tokenUrl", skip_serializing_if = "Option::is_none")]
43    pub token_url: Option<String>,
44    #[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
45    pub refresh_url: Option<String>,
46    #[serde(default)]
47    pub scopes: IndexMap<String, String>,
48}
49
50/// A security scheme definition.
51#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
52pub struct SecurityScheme {
53    #[serde(rename = "type")]
54    pub scheme_type: SecuritySchemeType,
55
56    #[serde(skip_serializing_if = "Option::is_none")]
57    pub description: Option<String>,
58
59    #[serde(skip_serializing_if = "Option::is_none")]
60    pub name: Option<String>,
61
62    #[serde(rename = "in", skip_serializing_if = "Option::is_none")]
63    pub location: Option<ApiKeyLocation>,
64
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub scheme: Option<String>,
67
68    #[serde(rename = "bearerFormat", skip_serializing_if = "Option::is_none")]
69    pub bearer_format: Option<String>,
70
71    #[serde(skip_serializing_if = "Option::is_none")]
72    pub flows: Option<OAuthFlows>,
73
74    #[serde(rename = "openIdConnectUrl", skip_serializing_if = "Option::is_none")]
75    pub open_id_connect_url: Option<String>,
76}
77
78/// A security requirement: map of scheme name → required scopes.
79pub type SecurityRequirement = IndexMap<String, Vec<String>>;