1use serde::{Deserialize, Serialize};
4
5use crate::diagnostic::SpecLocation;
6use crate::security::SecurityRequirement;
7use crate::types::TypeRef;
8use crate::value::ValueRef;
9
10#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11pub struct Operation {
12 pub id: String,
13 #[serde(default, skip_serializing_if = "Option::is_none")]
14 pub original_id: Option<String>,
15 pub method: HttpMethod,
16 pub path_template: String,
17 #[serde(default, skip_serializing_if = "Vec::is_empty")]
18 pub path_params: Vec<Parameter>,
19 #[serde(default, skip_serializing_if = "Vec::is_empty")]
20 pub query_params: Vec<Parameter>,
21 #[serde(default, skip_serializing_if = "Vec::is_empty")]
22 pub header_params: Vec<Parameter>,
23 #[serde(default, skip_serializing_if = "Vec::is_empty")]
24 pub cookie_params: Vec<Parameter>,
25 #[serde(default, skip_serializing_if = "Vec::is_empty")]
31 pub querystring_params: Vec<Parameter>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
33 pub request_body: Option<Body>,
34 #[serde(default, skip_serializing_if = "Vec::is_empty")]
35 pub responses: Vec<Response>,
36 #[serde(default, skip_serializing_if = "Vec::is_empty")]
37 pub security: Vec<SecurityRequirement>,
38 #[serde(default, skip_serializing_if = "Vec::is_empty")]
39 pub tags: Vec<String>,
40 #[serde(default, skip_serializing_if = "Option::is_none")]
43 pub summary: Option<String>,
44 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub description: Option<String>,
48 #[serde(default, skip_serializing_if = "crate::is_false")]
50 pub deprecated: bool,
51 #[serde(default, skip_serializing_if = "Option::is_none")]
53 pub external_docs: Option<crate::ExternalDocs>,
54 #[serde(default, skip_serializing_if = "Vec::is_empty")]
55 pub extensions: Vec<(String, ValueRef)>,
56 #[serde(default, skip_serializing_if = "Vec::is_empty")]
62 pub servers: Vec<crate::Server>,
63 #[serde(default, skip_serializing_if = "Vec::is_empty")]
69 pub callbacks: Vec<crate::Callback>,
70 #[serde(default, skip_serializing_if = "Option::is_none")]
71 pub location: Option<SpecLocation>,
72}
73
74#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
81#[serde(rename_all = "lowercase")]
82pub enum HttpMethod {
83 Get,
84 Put,
85 Post,
86 Delete,
87 Options,
88 Head,
89 Patch,
90 Trace,
91 Other(String),
93}
94
95impl HttpMethod {
96 pub fn as_str(&self) -> &str {
99 match self {
100 HttpMethod::Get => "GET",
101 HttpMethod::Put => "PUT",
102 HttpMethod::Post => "POST",
103 HttpMethod::Delete => "DELETE",
104 HttpMethod::Options => "OPTIONS",
105 HttpMethod::Head => "HEAD",
106 HttpMethod::Patch => "PATCH",
107 HttpMethod::Trace => "TRACE",
108 HttpMethod::Other(s) => s,
109 }
110 }
111}
112
113#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
114pub struct Parameter {
115 pub name: String,
116 #[serde(rename = "type")]
117 pub r#type: TypeRef,
118 pub required: bool,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
121 pub description: Option<String>,
122 #[serde(default, skip_serializing_if = "crate::is_false")]
124 pub deprecated: bool,
125 #[serde(default, skip_serializing_if = "Vec::is_empty")]
128 pub examples: Vec<(String, crate::Example)>,
129 #[serde(default, skip_serializing_if = "Option::is_none")]
130 pub style: Option<ParameterStyle>,
131 #[serde(default)]
132 pub explode: bool,
133 #[serde(default)]
137 pub allow_empty_value: bool,
138 #[serde(default)]
141 pub allow_reserved: bool,
142 #[serde(default, skip_serializing_if = "Vec::is_empty")]
145 pub extensions: Vec<(String, ValueRef)>,
146 #[serde(default, skip_serializing_if = "Option::is_none")]
147 pub location: Option<SpecLocation>,
148}
149
150#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
151#[serde(rename_all = "kebab-case")]
152pub enum ParameterStyle {
153 Form,
154 Simple,
155 Label,
156 Matrix,
157 SpaceDelimited,
158 PipeDelimited,
159 DeepObject,
160}
161
162#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
163pub struct Body {
164 pub content: Vec<BodyContent>,
165 pub required: bool,
166 #[serde(default, skip_serializing_if = "Option::is_none")]
168 pub description: Option<String>,
169 #[serde(default, skip_serializing_if = "Vec::is_empty")]
172 pub extensions: Vec<(String, ValueRef)>,
173}
174
175#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
176pub struct BodyContent {
177 pub media_type: String,
178 #[serde(rename = "type")]
179 pub r#type: TypeRef,
180 #[serde(default, skip_serializing_if = "Vec::is_empty")]
181 pub encoding: Vec<(String, Encoding)>,
182 #[serde(default, skip_serializing_if = "Option::is_none")]
190 pub item_schema: Option<TypeRef>,
191 #[serde(default, skip_serializing_if = "Vec::is_empty")]
195 pub examples: Vec<(String, crate::Example)>,
196 #[serde(default, skip_serializing_if = "Vec::is_empty")]
199 pub extensions: Vec<(String, ValueRef)>,
200}
201
202#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
203pub struct Encoding {
204 #[serde(default, skip_serializing_if = "Option::is_none")]
205 pub content_type: Option<String>,
206 #[serde(default, skip_serializing_if = "Option::is_none")]
207 pub style: Option<ParameterStyle>,
208 #[serde(default)]
209 pub explode: bool,
210 #[serde(default)]
215 pub allow_reserved: bool,
216 #[serde(default, skip_serializing_if = "Vec::is_empty")]
217 pub headers: Vec<(String, Header)>,
218 #[serde(default, skip_serializing_if = "Vec::is_empty")]
221 pub extensions: Vec<(String, ValueRef)>,
222}
223
224#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
233pub struct Header {
234 #[serde(rename = "type")]
235 pub r#type: TypeRef,
236 #[serde(default)]
237 pub required: bool,
238 #[serde(default, skip_serializing_if = "Option::is_none")]
240 pub description: Option<String>,
241 #[serde(default, skip_serializing_if = "crate::is_false")]
243 pub deprecated: bool,
244 #[serde(default, skip_serializing_if = "Vec::is_empty")]
246 pub examples: Vec<(String, crate::Example)>,
247 #[serde(default, skip_serializing_if = "Option::is_none")]
253 pub style: Option<ParameterStyle>,
254 #[serde(default)]
256 pub explode: bool,
257 #[serde(default)]
260 pub allow_reserved: bool,
261 #[serde(default)]
263 pub allow_empty_value: bool,
264 #[serde(default, skip_serializing_if = "Option::is_none")]
265 pub location: Option<SpecLocation>,
266}
267
268#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
269pub struct Response {
270 pub status: ResponseStatus,
271 #[serde(default, skip_serializing_if = "Vec::is_empty")]
272 pub content: Vec<BodyContent>,
273 #[serde(default, skip_serializing_if = "Vec::is_empty")]
274 pub headers: Vec<(String, Header)>,
275 #[serde(default, skip_serializing_if = "Option::is_none")]
277 pub summary: Option<String>,
278 #[serde(default, skip_serializing_if = "Option::is_none")]
281 pub description: Option<String>,
282 #[serde(default, skip_serializing_if = "Vec::is_empty")]
285 pub links: Vec<(String, crate::Link)>,
286 #[serde(default, skip_serializing_if = "Vec::is_empty")]
289 pub extensions: Vec<(String, ValueRef)>,
290}
291
292#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
293#[serde(tag = "kind", rename_all = "kebab-case")]
294pub enum ResponseStatus {
295 Explicit {
296 code: u16,
297 },
298 Default,
299 Range {
301 class: u8,
302 },
303}