1use std::collections::BTreeMap;
2
3use crate::extension::Extensions;
4use serde::{Deserialize, Serialize};
5use serde_json::{Number, Value};
6
7#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
11pub struct OpenApi {
12 pub openapi: String,
14 pub info: Info,
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub servers: Option<Vec<Server>>,
19
20 pub paths: Paths,
21
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub components: Option<Components>,
24
25 #[serde(skip_serializing_if = "Option::is_none")]
26 pub security: Option<SecurityRequirement>,
27
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub tags: Option<Vec<Tag>>,
30
31 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
33 pub external_docs: Option<ExternalDoc>,
34}
35#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
38pub struct Info {
39 pub title: String,
41 #[serde(skip_serializing_if = "Option::is_none")]
43 pub description: Option<String>,
44 #[serde(rename = "termsOfService", skip_serializing_if = "Option::is_none")]
46 pub terms_of_service: Option<String>,
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub contact: Option<Contact>,
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub license: Option<License>,
53 #[serde(skip_serializing_if = "Option::is_none")]
55 pub version: Option<String>,
56
57 #[serde(flatten)]
58 pub extensions: Extensions,
59}
60
61#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
64pub struct Contact {
65 #[serde(skip_serializing_if = "Option::is_none")]
67 pub name: Option<String>,
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub url: Option<String>,
71 #[serde(skip_serializing_if = "Option::is_none")]
73 pub email: Option<String>,
74
75 #[serde(flatten)]
76 pub extensions: Extensions,
77}
78
79#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
82pub struct License {
83 pub name: String,
85 #[serde(skip_serializing_if = "Option::is_none")]
87 pub url: Option<String>,
88
89 #[serde(flatten)]
90 pub extensions: Extensions,
91}
92
93#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
96pub struct Server {
97 pub url: String,
99 #[serde(skip_serializing_if = "Option::is_none")]
101 pub description: Option<String>,
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub variables: Option<BTreeMap<String, ServerVariable>>,
105
106 #[serde(flatten)]
107 pub extensions: Extensions,
108}
109
110#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
113pub struct ServerVariable {
114 #[serde(skip_serializing_if = "Option::is_none")]
116 pub r#enum: Option<Vec<String>>,
117 pub default: String,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub description: Option<String>,
122
123 #[serde(flatten)]
124 pub extensions: Extensions,
125}
126#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
129pub struct Components {
130 #[serde(skip_serializing_if = "Option::is_none")]
132 pub schemas: Option<BTreeMap<String, RefOrObject<Schema>>>,
133 #[serde(skip_serializing_if = "Option::is_none")]
135 pub responses: Option<Responses>,
136 #[serde(skip_serializing_if = "Option::is_none")]
138 pub parameters: Option<BTreeMap<String, RefOrObject<Parameter>>>,
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
142 #[serde(skip_serializing_if = "Option::is_none", rename = "requestBodies")]
144 pub request_bodies: Option<BTreeMap<String, RefOrObject<RequestBody>>>,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub headers: Option<BTreeMap<String, RefOrObject<Header>>>,
148 #[serde(skip_serializing_if = "Option::is_none", rename = "securitySchemes")]
150 pub security_schemes: Option<BTreeMap<String, RefOrObject<SecurityScheme>>>,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub links: Option<BTreeMap<String, RefOrObject<Link>>>,
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub callbacks: Option<BTreeMap<String, RefOrObject<Callback>>>,
157
158 #[serde(flatten)]
159 pub extensions: Extensions,
160}
161
162pub type Paths = BTreeMap<String, PathItem>;
169
170#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
173pub struct PathItem {
174 #[serde(rename = "$ref", skip_serializing_if = "Option::is_none")]
177 pub reference: Option<String>,
178 #[serde(skip_serializing_if = "Option::is_none")]
180 pub summary: Option<String>,
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub description: Option<String>,
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub get: Option<Operation>,
187 #[serde(skip_serializing_if = "Option::is_none")]
189 pub put: Option<Operation>,
190 #[serde(skip_serializing_if = "Option::is_none")]
192 pub post: Option<Operation>,
193 #[serde(skip_serializing_if = "Option::is_none")]
195 pub delete: Option<Operation>,
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub options: Option<Operation>,
199 #[serde(skip_serializing_if = "Option::is_none")]
201 pub head: Option<Operation>,
202 #[serde(skip_serializing_if = "Option::is_none")]
204 pub patch: Option<Operation>,
205 #[serde(skip_serializing_if = "Option::is_none")]
207 pub trace: Option<Operation>,
208 #[serde(skip_serializing_if = "Option::is_none")]
210 pub servers: Option<Vec<Server>>,
211
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub parameters: Option<Vec<RefOrObject<Parameter>>>,
215
216 #[serde(flatten)]
217 pub extensions: Extensions,
218}
219
220#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
223pub struct Operation {
224 #[serde(skip_serializing_if = "Option::is_none")]
226 pub tags: Option<Vec<String>>,
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub summary: Option<String>,
230 #[serde(skip_serializing_if = "Option::is_none")]
232 pub description: Option<String>,
233 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
235 pub external_docs: Option<ExternalDoc>,
236 #[serde(skip_serializing_if = "Option::is_none", rename = "operationId")]
238 pub operation_id: Option<String>,
239 #[serde(skip_serializing_if = "Option::is_none")]
241 pub parameters: Option<Vec<RefOrObject<Parameter>>>,
242 #[serde(skip_serializing_if = "Option::is_none", rename = "requestBody")]
244 pub request_body: Option<RefOrObject<RequestBody>>,
245 pub responses: Responses,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub callbacks: Option<BTreeMap<String, RefOrObject<Callback>>>,
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub deprecated: Option<bool>,
253 #[serde(skip_serializing_if = "Option::is_none")]
255 pub security: Option<Vec<SecurityRequirement>>,
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub servers: Option<Vec<Server>>,
259
260 #[serde(flatten)]
261 pub extensions: Extensions,
262}
263
264#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
267pub struct ExternalDoc {
268 #[serde(skip_serializing_if = "Option::is_none")]
270 pub description: Option<String>,
271 pub url: String,
273
274 #[serde(flatten)]
275 pub extensions: Extensions,
276}
277
278#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
283pub struct Parameter {
284 pub name: String,
286 pub r#in: String,
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub description: Option<String>,
291 #[serde(skip_serializing_if = "Option::is_none")]
293 pub required: Option<bool>,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub deprecated: Option<bool>,
297 #[serde(skip_serializing_if = "Option::is_none", rename = "allowEmptyValue")]
299 pub allow_empty_value: Option<bool>,
300
301 #[serde(skip_serializing_if = "Option::is_none")]
303 pub style: Option<String>,
304 #[serde(skip_serializing_if = "Option::is_none")]
306 pub explode: Option<bool>,
307
308 #[serde(skip_serializing_if = "Option::is_none", rename = "allowReserved")]
310 pub allow_reserved: Option<bool>,
311
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub schema: Option<RefOrObject<Schema>>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub example: Option<Value>,
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub content: Option<BTreeMap<String, Media>>,
324
325 #[serde(flatten)]
326 pub extensions: Extensions,
327}
328
329#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
332pub struct RequestBody {
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub description: Option<String>,
336 pub content: BTreeMap<String, Media>,
339 #[serde(skip_serializing_if = "Option::is_none")]
341 pub required: Option<bool>,
342
343 #[serde(flatten)]
344 pub extensions: Extensions,
345}
346
347pub type Responses = BTreeMap<String, RefOrObject<Response>>;
350
351#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
354pub struct Response {
355 pub description: String,
357 #[serde(skip_serializing_if = "Option::is_none")]
359 pub headers: Option<BTreeMap<String, RefOrObject<Header>>>,
360 #[serde(skip_serializing_if = "Option::is_none")]
362 pub content: Option<BTreeMap<String, Media>>,
363 #[serde(skip_serializing_if = "Option::is_none")]
365 pub links: Option<BTreeMap<String, RefOrObject<Link>>>,
366
367 #[serde(flatten)]
368 pub extensions: Extensions,
369}
370
371#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
374pub struct Media {
375 #[serde(skip_serializing_if = "Option::is_none")]
377 pub schema: Option<RefOrObject<Schema>>,
378 #[serde(skip_serializing_if = "Option::is_none")]
380 pub example: Option<Value>,
381 #[serde(skip_serializing_if = "Option::is_none")]
383 pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
384 #[serde(skip_serializing_if = "Option::is_none")]
386 pub encoding: Option<BTreeMap<String, Encoding>>,
387}
388
389#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
392pub struct Encoding {
393 #[serde(skip_serializing_if = "Option::is_none")]
395 #[serde(rename = "contentType")]
396 pub content_type: Option<String>,
397 #[serde(skip_serializing_if = "Option::is_none")]
399 pub headers: Option<BTreeMap<String, RefOrObject<Header>>>,
400 #[serde(skip_serializing_if = "Option::is_none")]
402 pub style: Option<String>,
403 #[serde(skip_serializing_if = "Option::is_none")]
405 pub explode: Option<bool>,
406 #[serde(skip_serializing_if = "Option::is_none")]
408 #[serde(rename = "allowReserved")]
409 pub allow_reserved: Option<bool>,
410}
411
412pub type Callback = BTreeMap<String, PathItem>;
415
416#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
418pub struct Example {
419 #[serde(skip_serializing_if = "Option::is_none")]
421 pub summary: Option<String>,
422 #[serde(skip_serializing_if = "Option::is_none")]
424 pub description: Option<String>,
425 #[serde(skip_serializing_if = "Option::is_none")]
427 pub value: Option<Value>,
428 #[serde(skip_serializing_if = "Option::is_none", rename = "externalValue")]
430 pub external_value: Option<String>,
431}
432
433#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
436pub struct Link {
437 #[serde(skip_serializing_if = "Option::is_none", rename = "operationRef")]
439 pub operation_ref: Option<String>,
440 #[serde(skip_serializing_if = "Option::is_none", rename = "operationId")]
442 pub operation_id: Option<String>,
443 #[serde(skip_serializing_if = "Option::is_none")]
445 pub parameters: Option<BTreeMap<String, Value>>,
446 #[serde(skip_serializing_if = "Option::is_none", rename = "requestBody")]
448 pub request_body: Option<Value>,
449 #[serde(skip_serializing_if = "Option::is_none")]
451 pub description: Option<String>,
452 #[serde(skip_serializing_if = "Option::is_none")]
454 pub server: Option<Server>,
455}
456#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
460pub struct Header {
461 #[serde(skip_serializing_if = "Option::is_none")]
463 pub description: Option<String>,
464 #[serde(skip_serializing_if = "Option::is_none")]
466 pub required: Option<bool>,
467 #[serde(skip_serializing_if = "Option::is_none")]
469 pub deprecated: Option<bool>,
470 #[serde(skip_serializing_if = "Option::is_none", rename = "allowEmptyValue")]
472 pub allow_empty_value: Option<bool>,
473
474 #[serde(skip_serializing_if = "Option::is_none")]
476 pub style: Option<String>,
477 #[serde(skip_serializing_if = "Option::is_none")]
479 pub explode: Option<bool>,
480
481 #[serde(skip_serializing_if = "Option::is_none", rename = "allowReserved")]
483 pub allow_reserved: Option<bool>,
484
485 #[serde(skip_serializing_if = "Option::is_none")]
487 pub schema: Option<RefOrObject<Schema>>,
488 #[serde(skip_serializing_if = "Option::is_none")]
490 pub example: Option<Value>,
491 #[serde(skip_serializing_if = "Option::is_none")]
493 pub examples: Option<BTreeMap<String, RefOrObject<Example>>>,
494 #[serde(skip_serializing_if = "Option::is_none")]
496 pub content: Option<BTreeMap<String, Media>>,
497
498 #[serde(flatten)]
499 pub extensions: Extensions,
500}
501#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
504pub struct Tag {
505 pub name: String,
507 #[serde(skip_serializing_if = "Option::is_none")]
509 pub description: Option<String>,
510 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
512 pub external_docs: Option<ExternalDoc>,
513
514 #[serde(flatten)]
515 pub extensions: Extensions,
516}
517
518#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
521pub struct Reference {
522 #[serde(rename = "$ref")]
524 pub reference: String,
525}
526
527#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
531pub struct Schema {
532 #[serde(skip_serializing_if = "Option::is_none")]
533 pub title: Option<String>,
534 #[serde(skip_serializing_if = "Option::is_none")]
535 #[serde(rename = "enum")]
536 pub r#enum: Option<Vec<String>>,
537 #[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
538 pub multiple_of: Option<Number>,
539 #[serde(skip_serializing_if = "Option::is_none")]
540 pub maximum: Option<Number>,
541 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
542 pub exclusive_maximum: Option<bool>,
543 #[serde(skip_serializing_if = "Option::is_none")]
544 pub minimum: Option<Number>,
545 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
546 pub exclusive_minimum: Option<bool>,
547 #[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
548 pub max_length: Option<Number>,
549 #[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
550 pub min_length: Option<Number>,
551 #[serde(skip_serializing_if = "Option::is_none")]
552 pub pattern: Option<String>,
553 #[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
554 pub max_items: Option<Number>,
555 #[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
556 pub min_items: Option<Number>,
557 #[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
558 pub unique_items: Option<bool>,
559 #[serde(skip_serializing_if = "Option::is_none")]
560 pub items: Option<Box<RefOrObject<Schema>>>,
561 #[serde(skip_serializing_if = "Option::is_none")]
562 pub properties: Option<BTreeMap<String, RefOrObject<Schema>>>,
563 #[serde(skip_serializing_if = "Option::is_none", rename = "maxProperties")]
564 pub max_properties: Option<Number>,
565 #[serde(skip_serializing_if = "Option::is_none", rename = "minProperties")]
566 pub min_properties: Option<Number>,
567 #[serde(skip_serializing_if = "Option::is_none")]
568 pub required: Option<Vec<String>>,
569 #[serde(skip_serializing_if = "Option::is_none")]
570 #[serde(rename = "type")]
571 pub r#type: Option<String>,
572 #[serde(skip_serializing_if = "Option::is_none", rename = "allOf")]
573 pub all_of: Option<Vec<Box<RefOrObject<Schema>>>>,
574 #[serde(skip_serializing_if = "Option::is_none", rename = "oneOf")]
575 pub one_of: Option<Vec<Box<RefOrObject<Schema>>>>,
576 #[serde(skip_serializing_if = "Option::is_none", rename = "anyOf")]
577 pub any_of: Option<Vec<Box<RefOrObject<Schema>>>>,
578 #[serde(skip_serializing_if = "Option::is_none")]
579 pub not: Option<Box<RefOrObject<Schema>>>,
580 #[serde(skip_serializing_if = "Option::is_none")]
581 pub description: Option<String>,
582 #[serde(skip_serializing_if = "Option::is_none")]
583 pub format: Option<String>,
584 #[serde(skip_serializing_if = "Option::is_none")]
585 pub default: Option<String>,
586 #[serde(
587 skip_serializing_if = "Option::is_none",
588 rename = "additionalProperties"
589 )]
590 pub additional_properties: Option<Value>,
591
592 #[serde(skip_serializing_if = "Option::is_none")]
593 pub nullable: Option<bool>,
594 #[serde(skip_serializing_if = "Option::is_none")]
596 pub discriminator: Option<Discriminator>,
597 #[serde(skip_serializing_if = "Option::is_none", rename = "readOnly")]
599 pub read_only: Option<bool>,
600 #[serde(skip_serializing_if = "Option::is_none", rename = "writeOnly")]
602 pub write_only: Option<bool>,
603 #[serde(skip_serializing_if = "Option::is_none")]
605 pub xml: Option<XML>,
606 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
608 pub external_docs: Option<ExternalDoc>,
609 #[serde(skip_serializing_if = "Option::is_none")]
611 pub example: Option<Value>,
612 #[serde(skip_serializing_if = "Option::is_none")]
614 pub deprecated: Option<bool>,
615}
616
617#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
620pub struct Discriminator {
621 #[serde(rename = "propertyName")]
623 pub property_name: String,
624 #[serde(skip_serializing_if = "Option::is_none")]
626 pub mapping: Option<BTreeMap<String, String>>,
627}
628
629#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
632pub struct XML {
633 #[serde(skip_serializing_if = "Option::is_none")]
635 pub name: Option<String>,
636 #[serde(skip_serializing_if = "Option::is_none")]
638 pub namespace: Option<String>,
639 #[serde(skip_serializing_if = "Option::is_none")]
641 pub prefix: Option<String>,
642 #[serde(skip_serializing_if = "Option::is_none")]
644 pub attribute: Option<bool>,
645 #[serde(skip_serializing_if = "Option::is_none")]
647 pub wrapped: Option<bool>,
648}
649
650#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
653pub struct SecurityScheme {
654 pub r#type: SecuritySchemeType,
656 #[serde(skip_serializing_if = "Option::is_none")]
658 pub description: Option<String>,
659 pub name: String,
661 pub r#in: String,
663 pub scheme: String,
665 #[serde(skip_serializing_if = "Option::is_none", rename = "beareFormat")]
667 pub beare_format: Option<String>,
668 pub flows: OAuthFlows,
670 #[serde(rename = "openIdConnectUrl")]
672 pub open_id_connect_url: String,
673}
674
675#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
678#[serde(rename_all = "camelCase")]
679pub enum SecuritySchemeType {
680 ApiKey,
681 Http,
682 Oauth2,
683 OpenIdConnect,
684}
685
686#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
690pub struct OAuthFlows {
691 #[serde(skip_serializing_if = "Option::is_none")]
693 pub implicit: Option<OAuthFlow>,
694 #[serde(skip_serializing_if = "Option::is_none")]
696 pub password: Option<OAuthFlow>,
697 #[serde(skip_serializing_if = "Option::is_none", rename = "clientCredentials")]
699 pub client_credentials: Option<OAuthFlow>,
700 #[serde(skip_serializing_if = "Option::is_none", rename = "authorizationCode")]
702 pub authorization_code: Option<OAuthFlow>,
703}
704
705#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
708pub struct OAuthFlow {
709 #[serde(rename = "authorizationUrl")]
711 pub authorization_url: String,
712 #[serde(rename = "tokenUrl")]
714 pub token_url: String,
715 #[serde(rename = "refreshUrl", skip_serializing_if = "Option::is_none")]
717 pub refresh_url: Option<String>,
718 pub scopes: BTreeMap<String, String>,
720}
721
722pub type SecurityRequirement = BTreeMap<String, Vec<String>>;
725
726#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
727#[serde(untagged)]
728pub enum RefOrObject<T> {
729 Ref(Reference),
730 Object(T),
731}