use std::collections::BTreeMap;
use crate::extension::Extensions;
use serde::{Deserialize, Serialize};
use serde_json::{Number, Value};
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct OpenApi {
pub openapi: String,
pub info: Info,
#[serde(skip_serializing_if = "Option::is_none")]
pub servers: Option<Vec<Server>>,
pub paths: Paths,
#[serde(skip_serializing_if = "Option::is_none")]
pub components: Option<Components>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security: Option<SecurityRequirement>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<Tag>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
pub external_docs: Option<ExternalDoc>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct Info {
pub title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "termsOfService", skip_serializing_if = "Option::is_none")]
pub terms_of_service: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub contact: Option<Contact>,
#[serde(skip_serializing_if = "Option::is_none")]
pub license: Option<License>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Contact {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct License {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Server {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub variables: Option<BTreeMap<String, ServerVariable>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct ServerVariable {
#[serde(skip_serializing_if = "Option::is_none")]
pub r#enum: Option<Vec<String>>,
pub default: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Components {
#[serde(skip_serializing_if = "Option::is_none")]
pub schemas: Option<BTreeMap<String, RefOrObject<Schema>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub responses: Option<BTreeMap<String, RefOrObject<Response>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<BTreeMap<String, RefOrObject<Parameter>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "requestBodies")]
pub request_bodies: Option<BTreeMap<String, RefOrObject<RequestBody>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<BTreeMap<String, RefOrObject<Header>>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "securitySchemes")]
pub security_schemes: Option<BTreeMap<String, RefOrObject<SecurityScheme>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<BTreeMap<String, RefOrObject<Link>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callbacks: Option<BTreeMap<String, RefOrObject<Callback>>>,
#[serde(flatten)]
pub extensions: Extensions,
}
pub type Paths = BTreeMap<String, PathItem>;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct PathItem {
#[serde(rename = "$ref", skip_serializing_if = "Option::is_none")]
pub reference: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub get: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub put: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub delete: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub head: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub patch: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub trace: Option<Operation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub servers: Option<Vec<Server>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Vec<RefOrObject<Parameter>>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Operation {
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
pub external_docs: Option<ExternalDoc>,
#[serde(skip_serializing_if = "Option::is_none", rename = "operationId")]
pub operation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<Vec<RefOrObject<Parameter>>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "requestBody")]
pub request_body: Option<RefOrObject<RequestBody>>,
pub responses: Responses,
#[serde(skip_serializing_if = "Option::is_none")]
pub callbacks: Option<BTreeMap<String, RefOrObject<Callback>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deprecated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub security: Option<Vec<SecurityRequirement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub servers: Option<Vec<Server>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct ExternalDoc {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub url: String,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Parameter {
pub name: String,
pub r#in: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deprecated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "allowEmptyValue")]
pub allow_empty_value: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub explode: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "allowReserved")]
pub allow_reserved: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schema: Option<RefOrObject<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<BTreeMap<String, Media>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct RequestBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub content: BTreeMap<String, Media>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(flatten)]
pub extensions: Extensions,
}
pub type Responses = BTreeMap<String, RefOrObject<Response>>;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Response {
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<BTreeMap<String, RefOrObject<Header>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<BTreeMap<String, Media>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub links: Option<BTreeMap<String, RefOrObject<Link>>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Media {
#[serde(skip_serializing_if = "Option::is_none")]
pub schema: Option<RefOrObject<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub encoding: Option<BTreeMap<String, Encoding>>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Encoding {
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "contentType")]
pub content_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub headers: Option<BTreeMap<String, RefOrObject<Header>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub explode: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "allowReserved")]
pub allow_reserved: Option<bool>,
}
pub type Callback = BTreeMap<String, PathItem>;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Example {
#[serde(skip_serializing_if = "Option::is_none")]
pub summary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalValue")]
pub external_value: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Link {
#[serde(skip_serializing_if = "Option::is_none", rename = "operationRef")]
pub operation_ref: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "operationId")]
pub operation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parameters: Option<BTreeMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "requestBody")]
pub request_body: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub server: Option<Server>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
pub struct Header {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deprecated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "allowEmptyValue")]
pub allow_empty_value: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub style: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub explode: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "allowReserved")]
pub allow_reserved: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub schema: Option<RefOrObject<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<BTreeMap<String, Media>>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Tag {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
pub external_docs: Option<ExternalDoc>,
#[serde(flatten)]
pub extensions: Extensions,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Reference {
#[serde(rename = "$ref")]
pub reference: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Schema {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "enum")]
pub r#enum: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
pub multiple_of: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub maximum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
pub exclusive_maximum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minimum: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
pub exclusive_minimum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
pub max_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
pub min_length: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
pub max_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
pub min_items: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
pub unique_items: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub items: Option<Box<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<BTreeMap<String, Schema>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "maxProperties")]
pub max_properties: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none", rename = "minProperties")]
pub min_properties: Option<Number>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "type")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", rename = "allOf")]
pub all_of: Option<Vec<Box<Schema>>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "oneOf")]
pub one_of: Option<Vec<Box<Schema>>>,
#[serde(skip_serializing_if = "Option::is_none", rename = "anyOf")]
pub any_of: Option<Vec<Box<Schema>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub not: Option<Box<Schema>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<String>,
#[serde(
skip_serializing_if = "Option::is_none",
rename = "additionalProperties"
)]
pub additional_properties: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nullable: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub discriminator: Option<Discriminator>,
#[serde(skip_serializing_if = "Option::is_none", rename = "readOnly")]
pub read_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none", rename = "writeOnly")]
pub write_only: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub xml: Option<XML>,
#[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
pub external_docs: Option<ExternalDoc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub example: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deprecated: Option<bool>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct Discriminator {
#[serde(rename = "propertyName")]
pub property_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub mapping: Option<BTreeMap<String, String>>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct XML {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub namespace: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prefix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attribute: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wrapped: Option<bool>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct SecurityScheme {
pub r#type: SecuritySchemeType,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub name: String,
pub r#in: String,
pub scheme: String,
#[serde(skip_serializing_if = "Option::is_none", rename = "beareFormat")]
pub beare_format: Option<String>,
pub flows: OAuthFlows,
#[serde(rename = "openIdConnectUrl")]
pub open_id_connect_url: String,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum SecuritySchemeType {
ApiKey,
Http,
Oauth2,
OpenIdConnect,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct OAuthFlows {
#[serde(skip_serializing_if = "Option::is_none")]
pub implicit: Option<OAuthFlow>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password: Option<OAuthFlow>,
#[serde(skip_serializing_if = "Option::is_none", rename = "clientCredentials")]
pub client_credentials: Option<OAuthFlow>,
#[serde(skip_serializing_if = "Option::is_none", rename = "authorizationCode")]
pub authorization_code: Option<OAuthFlow>,
}
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
pub struct OAuthFlow {
#[serde(rename = "authorizationUrl")]
pub authorization_url: String,
#[serde(rename = "tokenUrl")]
pub token_url: String,
#[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
pub refresh_url: Option<String>,
pub scopes: BTreeMap<String, String>,
}
pub type SecurityRequirement = BTreeMap<String, Vec<String>>;
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
#[serde(untagged)]
pub enum RefOrObject<T> {
Ref(Reference),
Object(T),
}