use serde::{Deserialize, Serialize};
use crate::diagnostic::SpecLocation;
use crate::security::SecurityRequirement;
use crate::types::TypeRef;
use crate::value::ValueRef;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Operation {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub original_id: Option<String>,
pub method: HttpMethod,
pub path_template: String,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub path_params: Vec<Parameter>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub query_params: Vec<Parameter>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub header_params: Vec<Parameter>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub cookie_params: Vec<Parameter>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub querystring_params: Vec<Parameter>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_body: Option<Body>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub responses: Vec<Response>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub security: Vec<SecurityRequirement>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default)]
pub deprecated: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub external_docs: Option<crate::ExternalDocs>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub servers: Vec<crate::Server>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub callbacks: Vec<crate::Callback>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub location: Option<SpecLocation>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum HttpMethod {
Get,
Put,
Post,
Delete,
Options,
Head,
Patch,
Trace,
Other(String),
}
impl HttpMethod {
pub fn as_str(&self) -> &str {
match self {
HttpMethod::Get => "GET",
HttpMethod::Put => "PUT",
HttpMethod::Post => "POST",
HttpMethod::Delete => "DELETE",
HttpMethod::Options => "OPTIONS",
HttpMethod::Head => "HEAD",
HttpMethod::Patch => "PATCH",
HttpMethod::Trace => "TRACE",
HttpMethod::Other(s) => s,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Parameter {
pub name: String,
#[serde(rename = "type")]
pub r#type: TypeRef,
pub required: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default)]
pub deprecated: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub style: Option<ParameterStyle>,
#[serde(default)]
pub explode: bool,
#[serde(default)]
pub allow_empty_value: bool,
#[serde(default)]
pub allow_reserved: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub examples: Vec<(String, crate::Example)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub location: Option<SpecLocation>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum ParameterStyle {
Form,
Simple,
Label,
Matrix,
SpaceDelimited,
PipeDelimited,
DeepObject,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Body {
pub content: Vec<BodyContent>,
pub required: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct BodyContent {
pub media_type: String,
#[serde(rename = "type")]
pub r#type: TypeRef,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub encoding: Vec<(String, Encoding)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub item_schema: Option<TypeRef>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub examples: Vec<(String, crate::Example)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Encoding {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub style: Option<ParameterStyle>,
#[serde(default)]
pub explode: bool,
#[serde(default)]
pub allow_reserved: bool,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub headers: Vec<(String, Header)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Header {
#[serde(rename = "type")]
pub r#type: TypeRef,
#[serde(default)]
pub required: bool,
#[serde(default)]
pub deprecated: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub examples: Vec<(String, crate::Example)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub style: Option<ParameterStyle>,
#[serde(default)]
pub explode: bool,
#[serde(default)]
pub allow_reserved: bool,
#[serde(default)]
pub allow_empty_value: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub location: Option<SpecLocation>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Response {
pub status: ResponseStatus,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub content: Vec<BodyContent>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub headers: Vec<(String, Header)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub links: Vec<(String, crate::Link)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "kebab-case")]
pub enum ResponseStatus {
Explicit {
code: u16,
},
Default,
Range {
class: u8,
},
}