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")]
41 pub documentation: Option<String>,
42 #[serde(default)]
43 pub deprecated: bool,
44 #[serde(default, skip_serializing_if = "Vec::is_empty")]
45 pub extensions: Vec<(String, ValueRef)>,
46 #[serde(default, skip_serializing_if = "Option::is_none")]
48 pub external_docs: Option<crate::ExternalDocs>,
49 #[serde(default, skip_serializing_if = "Vec::is_empty")]
55 pub servers: Vec<crate::Server>,
56 #[serde(default, skip_serializing_if = "Vec::is_empty")]
62 pub callbacks: Vec<crate::Callback>,
63 #[serde(default, skip_serializing_if = "Option::is_none")]
64 pub location: Option<SpecLocation>,
65}
66
67#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
74#[serde(rename_all = "lowercase")]
75pub enum HttpMethod {
76 Get,
77 Put,
78 Post,
79 Delete,
80 Options,
81 Head,
82 Patch,
83 Trace,
84 Other(String),
86}
87
88impl HttpMethod {
89 pub fn as_str(&self) -> &str {
92 match self {
93 HttpMethod::Get => "GET",
94 HttpMethod::Put => "PUT",
95 HttpMethod::Post => "POST",
96 HttpMethod::Delete => "DELETE",
97 HttpMethod::Options => "OPTIONS",
98 HttpMethod::Head => "HEAD",
99 HttpMethod::Patch => "PATCH",
100 HttpMethod::Trace => "TRACE",
101 HttpMethod::Other(s) => s,
102 }
103 }
104}
105
106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
107pub struct Parameter {
108 pub name: String,
109 #[serde(rename = "type")]
110 pub r#type: TypeRef,
111 pub required: bool,
112 #[serde(default, skip_serializing_if = "Option::is_none")]
113 pub documentation: Option<String>,
114 #[serde(default)]
115 pub deprecated: bool,
116 #[serde(default, skip_serializing_if = "Option::is_none")]
117 pub style: Option<ParameterStyle>,
118 #[serde(default)]
119 pub explode: bool,
120 #[serde(default)]
124 pub allow_empty_value: bool,
125 #[serde(default)]
128 pub allow_reserved: bool,
129 #[serde(default, skip_serializing_if = "Vec::is_empty")]
133 pub examples: Vec<(String, crate::Example)>,
134 #[serde(default, skip_serializing_if = "Vec::is_empty")]
137 pub extensions: Vec<(String, ValueRef)>,
138 #[serde(default, skip_serializing_if = "Option::is_none")]
139 pub location: Option<SpecLocation>,
140}
141
142#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
143#[serde(rename_all = "kebab-case")]
144pub enum ParameterStyle {
145 Form,
146 Simple,
147 Label,
148 Matrix,
149 SpaceDelimited,
150 PipeDelimited,
151 DeepObject,
152}
153
154#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
155pub struct Body {
156 pub content: Vec<BodyContent>,
157 pub required: bool,
158 #[serde(default, skip_serializing_if = "Option::is_none")]
159 pub documentation: Option<String>,
160 #[serde(default, skip_serializing_if = "Vec::is_empty")]
163 pub extensions: Vec<(String, ValueRef)>,
164}
165
166#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
167pub struct BodyContent {
168 pub media_type: String,
169 #[serde(rename = "type")]
170 pub r#type: TypeRef,
171 #[serde(default, skip_serializing_if = "Vec::is_empty")]
172 pub encoding: Vec<(String, Encoding)>,
173 #[serde(default, skip_serializing_if = "Option::is_none")]
181 pub item_schema: Option<TypeRef>,
182 #[serde(default, skip_serializing_if = "Vec::is_empty")]
186 pub examples: Vec<(String, crate::Example)>,
187 #[serde(default, skip_serializing_if = "Vec::is_empty")]
190 pub extensions: Vec<(String, ValueRef)>,
191}
192
193#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
194pub struct Encoding {
195 #[serde(default, skip_serializing_if = "Option::is_none")]
196 pub content_type: Option<String>,
197 #[serde(default, skip_serializing_if = "Option::is_none")]
198 pub style: Option<ParameterStyle>,
199 #[serde(default)]
200 pub explode: bool,
201 #[serde(default)]
206 pub allow_reserved: bool,
207 #[serde(default, skip_serializing_if = "Vec::is_empty")]
208 pub headers: Vec<(String, Header)>,
209 #[serde(default, skip_serializing_if = "Vec::is_empty")]
212 pub extensions: Vec<(String, ValueRef)>,
213}
214
215#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
224pub struct Header {
225 #[serde(rename = "type")]
226 pub r#type: TypeRef,
227 #[serde(default)]
228 pub required: bool,
229 #[serde(default)]
230 pub deprecated: bool,
231 #[serde(default, skip_serializing_if = "Option::is_none")]
232 pub documentation: Option<String>,
233 #[serde(default, skip_serializing_if = "Vec::is_empty")]
234 pub examples: Vec<(String, crate::Example)>,
235 #[serde(default, skip_serializing_if = "Option::is_none")]
241 pub style: Option<ParameterStyle>,
242 #[serde(default)]
244 pub explode: bool,
245 #[serde(default)]
248 pub allow_reserved: bool,
249 #[serde(default)]
251 pub allow_empty_value: bool,
252 #[serde(default, skip_serializing_if = "Option::is_none")]
253 pub location: Option<SpecLocation>,
254}
255
256#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
257pub struct Response {
258 pub status: ResponseStatus,
259 #[serde(default, skip_serializing_if = "Vec::is_empty")]
260 pub content: Vec<BodyContent>,
261 #[serde(default, skip_serializing_if = "Vec::is_empty")]
262 pub headers: Vec<(String, Header)>,
263 #[serde(default, skip_serializing_if = "Option::is_none")]
264 pub documentation: Option<String>,
265 #[serde(default, skip_serializing_if = "Vec::is_empty")]
268 pub links: Vec<(String, crate::Link)>,
269 #[serde(default, skip_serializing_if = "Vec::is_empty")]
272 pub extensions: Vec<(String, ValueRef)>,
273}
274
275#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
276#[serde(tag = "kind", rename_all = "kebab-case")]
277pub enum ResponseStatus {
278 Explicit {
279 code: u16,
280 },
281 Default,
282 Range {
284 class: u8,
285 },
286}