use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct OpenApiSpec {
pub openapi: Option<String>,
pub info: Option<Info>,
pub paths: Option<HashMap<String, PathItem>>,
pub components: Option<Components>,
pub servers: Option<Vec<Server>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Info {
pub title: Option<String>,
pub description: Option<String>,
pub version: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Server {
pub url: Option<String>,
pub description: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct PathItem {
pub get: Option<Operation>,
pub post: Option<Operation>,
pub put: Option<Operation>,
pub delete: Option<Operation>,
pub patch: Option<Operation>,
pub options: Option<Operation>,
pub head: Option<Operation>,
pub trace: Option<Operation>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Operation {
pub tags: Option<Vec<String>>,
pub summary: Option<String>,
pub description: Option<String>,
pub operation_id: Option<String>,
pub parameters: Option<Vec<Parameter>>,
pub request_body: Option<RequestBody>,
pub responses: Option<Responses>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Parameter {
pub name: Option<String>,
#[serde(rename = "in")] pub in_: Option<String>,
pub required: Option<bool>,
pub schema: Option<Schema>,
pub description: Option<String>,
pub example: Option<serde_json::Value>,
pub examples: Option<HashMap<String, Example>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct RequestBody {
pub content: Option<HashMap<String, MediaType>>,
pub description: Option<String>,
pub required: Option<bool>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct MediaType {
pub schema: Option<Schema>,
pub example: Option<serde_json::Value>,
pub examples: Option<HashMap<String, Example>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Responses {
#[serde(flatten)]
pub responses: Option<HashMap<String, Response>>,
pub default: Option<Response>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Response {
pub description: Option<String>,
pub content: Option<HashMap<String, MediaType>>,
pub headers: Option<HashMap<String, Header>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Header {
pub description: Option<String>,
pub schema: Option<Schema>,
pub example: Option<serde_json::Value>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Components {
pub schemas: Option<HashMap<String, Schema>>,
pub responses: Option<HashMap<String, Response>>,
pub parameters: Option<HashMap<String, Parameter>>,
pub examples: Option<HashMap<String, Example>>,
pub request_bodies: Option<HashMap<String, RequestBody>>,
pub headers: Option<HashMap<String, Header>>,
pub security_schemes: Option<HashMap<String, SecurityScheme>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Example {
pub summary: Option<String>,
pub description: Option<String>,
pub value: Option<serde_json::Value>,
pub external_value: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Schema {
pub title: Option<String>,
pub multiple_of: Option<f64>,
pub maximum: Option<f64>,
pub exclusive_maximum: Option<bool>,
pub minimum: Option<f64>,
pub exclusive_minimum: Option<bool>,
pub max_length: Option<u32>,
pub min_length: Option<u32>,
pub pattern: Option<String>,
pub max_items: Option<u32>,
pub min_items: Option<u32>,
pub unique_items: Option<bool>,
pub max_properties: Option<u32>,
pub min_properties: Option<u32>,
pub required: Option<Vec<String>>,
#[serde(rename = "type")] pub type_: Option<String>,
pub not: Option<Box<Schema>>,
pub all_of: Option<Vec<Schema>>,
pub one_of: Option<Vec<Schema>>,
pub any_of: Option<Vec<Schema>>,
pub items: Option<Box<Schema>>,
pub properties: Option<HashMap<String, Schema>>,
pub additional_properties: Option<Box<Schema>>,
pub description: Option<String>,
pub format: Option<String>,
pub default: Option<serde_json::Value>,
pub nullable: Option<bool>,
pub discriminator: Option<Discriminator>,
pub read_only: Option<bool>,
pub write_only: Option<bool>,
pub xml: Option<XML>,
pub example: Option<serde_json::Value>,
pub deprecated: Option<bool>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct Discriminator {
pub property_name: Option<String>,
pub mapping: Option<HashMap<String, String>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct SecurityScheme {
#[serde(rename = "type")]
pub type_: Option<String>,
pub description: Option<String>,
pub name: Option<String>,
pub in_: Option<String>, pub scheme: Option<String>,
pub bearer_format: Option<String>,
pub flows: Option<OAuthFlows>,
pub open_id_connect_url: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct OAuthFlows {
pub implicit: Option<OAuthFlow>,
pub password: Option<OAuthFlow>,
pub client_credentials: Option<OAuthFlow>,
pub authorization_code: Option<OAuthFlow>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct OAuthFlow {
pub authorization_url: Option<String>,
pub token_url: Option<String>,
pub refresh_url: Option<String>,
pub scopes: Option<HashMap<String, String>>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct XML {
pub name: Option<String>,
pub namespace: Option<String>,
pub prefix: Option<String>,
pub attribute: Option<bool>,
pub wrapped: Option<bool>,
}