use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Operation {
#[serde(rename = "operationId")]
pub id: String,
pub path: String,
pub method: String,
pub tags: Option<Vec<String>>,
pub summary: Option<String>,
pub description: Option<String>,
#[serde(rename = "externalDocs")]
pub external_docs: Option<serde_json::Value>,
pub parameters: Vec<Parameter>,
pub request_body: Option<RequestBody>,
pub responses: Vec<Response>,
pub callbacks: Option<serde_json::Value>,
pub deprecated: Option<bool>,
pub security: Option<Vec<serde_json::Value>>,
pub servers: Option<Vec<serde_json::Value>>,
#[serde(flatten)]
pub vendor_extensions: std::collections::HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Parameter {
pub name: String,
pub location: ParameterLocation,
pub required: bool,
pub schema: Schema,
pub description: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ParameterLocation {
Path,
Query,
Header,
Cookie,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestBody {
pub required: bool,
pub content: serde_json::Value,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Response {
pub status_code: String,
pub description: String,
pub content: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Schema {
#[serde(rename = "type")]
pub schema_type: Option<String>,
pub format: Option<String>,
pub items: Option<Box<Schema>>,
pub properties: Option<std::collections::HashMap<String, Schema>>,
pub required: Option<Vec<String>>,
pub description: Option<String>,
pub title: Option<String>,
pub default: Option<serde_json::Value>,
pub example: Option<serde_json::Value>,
#[serde(rename = "enum")]
pub enum_values: Option<Vec<serde_json::Value>>,
pub minimum: Option<f64>,
pub maximum: Option<f64>,
pub min_length: Option<usize>,
pub max_length: Option<usize>,
pub pattern: Option<String>,
pub min_items: Option<usize>,
pub max_items: Option<usize>,
pub unique_items: Option<bool>,
pub additional_properties: Option<Box<AdditionalProperties>>,
pub all_of: Option<Vec<Schema>>,
pub one_of: Option<Vec<Schema>>,
pub any_of: Option<Vec<Schema>>,
pub not: Option<Box<Schema>>,
pub discriminator: Option<Discriminator>,
pub read_only: Option<bool>,
pub write_only: Option<bool>,
pub xml: Option<serde_json::Value>,
pub external_docs: Option<ExternalDocs>,
pub deprecated: Option<bool>,
pub nullable: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum AdditionalProperties {
Boolean(bool),
Schema(Box<Schema>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Discriminator {
pub property_name: String,
pub mapping: Option<std::collections::HashMap<String, String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExternalDocs {
pub url: String,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenApiContext {
pub version: String,
pub info: ApiInfo,
pub servers: Vec<Server>,
pub operations: Vec<Operation>,
pub components: Option<Components>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApiInfo {
pub title: String,
pub version: String,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Server {
pub url: String,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Components {
pub schemas: serde_json::Value,
}