1use crate::extension::Extensions;
2use serde::{Deserialize, Serialize};
3use serde_json::{Number, Value};
4use std::collections::BTreeMap;
5
6#[derive(Deserialize, Serialize, Debug, PartialEq, Clone)]
14pub struct Swagger {
15 pub swagger: String,
17 pub info: Info,
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub host: Option<String>,
22 #[serde(skip_serializing_if = "Option::is_none", rename = "basePath")]
24 pub base_path: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub schemas: Option<Vec<TransferProtocol>>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub consumes: Option<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub produces: Option<String>,
34
35 pub paths: BTreeMap<String, PathItem>,
37
38 #[serde(skip_serializing_if = "Option::is_none")]
40 pub definitions: Option<BTreeMap<String, Schema>>,
41
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub parameters: Option<BTreeMap<String, Parameter>>,
45
46 #[serde(skip_serializing_if = "Option::is_none")]
48 pub responses: Option<BTreeMap<String, Response>>,
49
50 #[serde(
52 skip_serializing_if = "Option::is_none",
53 rename = "securityDefinitions"
54 )]
55 pub security_definitions: Option<BTreeMap<String, SecurityScheme>>,
56
57 #[serde(skip_serializing_if = "Option::is_none")]
59 pub security: Option<Vec<SecurityRequirementObject>>,
60
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub tags: Option<Vec<Tag>>,
64
65 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
67 pub external_docs: Option<ExternalDoc>,
68
69 #[serde(flatten)]
71 pub extensions: Extensions,
72}
73
74#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
78pub struct Info {
79 pub title: String,
81 #[serde(skip_serializing_if = "Option::is_none")]
83 pub description: Option<String>,
84 #[serde(rename = "termsOfService", skip_serializing_if = "Option::is_none")]
86 pub terms_of_service: Option<String>,
87 #[serde(skip_serializing_if = "Option::is_none")]
89 pub contact: Option<Contact>,
90 #[serde(skip_serializing_if = "Option::is_none")]
92 pub license: Option<License>,
93 #[serde(skip_serializing_if = "Option::is_none")]
95 pub version: Option<String>,
96 #[serde(flatten)]
97 pub extensions: Extensions,
98}
99
100#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
104pub struct Contact {
105 #[serde(skip_serializing_if = "Option::is_none")]
107 pub name: Option<String>,
108 #[serde(skip_serializing_if = "Option::is_none")]
110 pub url: Option<String>,
111 #[serde(skip_serializing_if = "Option::is_none")]
113 pub email: Option<String>,
114 #[serde(flatten)]
115 pub extensions: Extensions,
116}
117
118#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
122pub struct License {
123 pub name: String,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub url: Option<String>,
128 #[serde(flatten)]
129 pub extensions: Extensions,
130}
131
132#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
136#[serde(rename_all = "lowercase")]
137pub enum TransferProtocol {
138 #[default]
139 Http,
140 Https,
141 Ws,
142 Wss,
143}
144
145#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
149pub struct ExternalDoc {
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub description: Option<String>,
153 pub url: String,
155}
156
157#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
163pub struct Tag {
164 pub name: String,
166 #[serde(skip_serializing_if = "Option::is_none")]
168 pub description: Option<String>,
169 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDoc")]
171 pub external_doc: Option<ExternalDoc>,
172}
173
174#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
175#[serde(rename_all = "lowercase")]
176pub enum InEnum {
177 Query,
178 Header,
179}
180
181#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
182#[serde(rename_all = "lowercase")]
183pub enum Flow {
184 Implicit,
185 Password,
186 Application,
187 AccessCode,
188}
189
190#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
191#[serde(rename_all = "lowercase")]
192pub enum Scopes {
193 Implicit,
194 Password,
195 Application,
196 AccessCode,
197}
198
199#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
200#[serde(rename_all = "lowercase")]
201pub enum AuthorizationUrl {
202 Implicit,
203 AccessCode,
204}
205#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
209#[serde(rename_all = "camelCase")]
210pub enum SecuritySchemeType {
211 Basic,
212 ApiKey,
213 Oauth2,
214}
215
216#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
220#[serde(rename_all = "camelCase")]
221pub enum TokenUrl {
222 Password,
223 Application,
224 AccessCode,
225}
226#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
232pub struct SecurityScheme {
233 pub r#type: SecuritySchemeType,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub description: Option<String>,
238 pub name: String,
240 pub r#in: InEnum,
242 pub flow: Option<Flow>,
244 #[serde(rename = "authorizationUrl", skip_serializing_if = "Option::is_none")]
246 pub authorization_url: Option<AuthorizationUrl>,
247 #[serde(rename = "tokenUrl", skip_serializing_if = "Option::is_none")]
249 pub token_url: Option<TokenUrl>,
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub scopes: Option<BTreeMap<String, String>>,
253 #[serde(flatten)]
255 pub extensions: Extensions,
256}
257
258#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
266pub struct SecurityRequirementObject(BTreeMap<String, Vec<String>>);
267
268#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
273pub struct PathItem {
274 #[serde(rename = "$ref", skip_serializing_if = "Option::is_none")]
277 pub reference: Option<String>,
278 #[serde(skip_serializing_if = "Option::is_none")]
280 pub get: Option<Operation>,
281 #[serde(skip_serializing_if = "Option::is_none")]
283 pub put: Option<Operation>,
284 #[serde(skip_serializing_if = "Option::is_none")]
286 pub post: Option<Operation>,
287 #[serde(skip_serializing_if = "Option::is_none")]
289 pub delete: Option<Operation>,
290 #[serde(skip_serializing_if = "Option::is_none")]
292 pub options: Option<Operation>,
293 #[serde(skip_serializing_if = "Option::is_none")]
295 pub head: Option<Operation>,
296 #[serde(skip_serializing_if = "Option::is_none")]
298 pub patch: Option<Operation>,
299 #[serde(skip_serializing_if = "Option::is_none")]
301 pub parameters: Option<Vec<ParameterOrRef>>,
302}
303
304#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
307pub struct Operation {
308 #[serde(skip_serializing_if = "Option::is_none")]
311 pub tags: Option<Vec<String>>,
312 #[serde(skip_serializing_if = "Option::is_none")]
314 pub summary: Option<String>,
315 #[serde(skip_serializing_if = "Option::is_none")]
317 pub description: Option<String>,
318 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
320 pub external_docs: Option<ExternalDoc>,
321 #[serde(skip_serializing_if = "Option::is_none", rename = "operationId")]
323 pub operation_id: Option<String>,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub consumes: Option<Vec<String>>,
327 #[serde(skip_serializing_if = "Option::is_none")]
329 pub produces: Option<Vec<String>>,
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub parameters: Option<Vec<ParameterOrRef>>,
333 pub responses: Responses,
335 #[serde(skip_serializing_if = "Option::is_none")]
337 pub schemas: Option<TransferProtocol>,
338 #[serde(skip_serializing_if = "Option::is_none")]
340 pub deprecated: Option<String>,
341 #[serde(skip_serializing_if = "Option::is_none")]
343 pub security: Option<Vec<SecurityRequirementObject>>,
344 #[serde(flatten)]
345 pub extensions: Extensions,
346}
347
348#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
349#[serde(rename_all = "camelCase")]
350pub enum ParamInEnum {
351 Query,
352 Header,
353 Path,
354 FormData,
355 Body,
356}
357
358#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
359#[serde(untagged)]
360pub enum ParameterOrRef {
361 Ref(Reference),
362 Parameter(Parameter),
363}
364#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
365pub struct Reference {
366 #[serde(rename = "$ref")]
367 pub reference: String,
368}
369
370#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
374pub struct Parameter {
375 pub name: String,
377 pub r#in: ParamInEnum,
379 #[serde(skip_serializing_if = "Option::is_none")]
381 pub description: Option<String>,
382 #[serde(skip_serializing_if = "Option::is_none")]
385 pub required: Option<bool>,
386 #[serde(skip_serializing_if = "Option::is_none")]
389 pub schema: Option<Schema>,
390 #[serde(skip_serializing_if = "Option::is_none")]
392 pub r#type: Option<ParameterType>,
393 #[serde(skip_serializing_if = "Option::is_none")]
395 pub format: Option<String>,
396 #[serde(skip_serializing_if = "Option::is_none", rename = "allowEmptyValue")]
398 pub allow_empty_value: Option<bool>,
399
400 #[serde(skip_serializing_if = "Option::is_none")]
402 pub items: Option<Items>,
403 #[serde(skip_serializing_if = "Option::is_none", rename = "collectionFormat")]
405 pub collection_format: Option<String>,
406
407 #[serde(skip_serializing_if = "Option::is_none")]
410 pub default: Option<Value>,
411 #[serde(skip_serializing_if = "Option::is_none")]
412 pub maximum: Option<Number>,
413 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
414 pub exclusive_maximum: Option<bool>,
415 #[serde(skip_serializing_if = "Option::is_none")]
416 pub minimum: Option<Number>,
417 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
418 pub exclusive_minimum: Option<bool>,
419 #[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
420 pub max_length: Option<Number>,
421 #[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
422 pub min_length: Option<Number>,
423 #[serde(skip_serializing_if = "Option::is_none")]
424 pub pattern: Option<String>,
425 #[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
426 pub max_items: Option<Number>,
427 #[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
428 pub min_items: Option<Number>,
429 #[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
430 pub unique_items: Option<bool>,
431 #[serde(skip_serializing_if = "Option::is_none")]
432 pub r#enum: Option<Vec<Value>>,
433 #[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
434 pub multiple_of: Option<Number>,
435 #[serde(flatten)]
436 pub extensions: Extensions,
437}
438
439#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Default)]
441pub struct Schema {
442 #[serde(skip_serializing_if = "Option::is_none")]
443 #[serde(rename = "$ref")]
446 pub reference: Option<String>,
447 #[serde(skip_serializing_if = "Option::is_none")]
448 #[serde(rename = "originalRef")]
449 pub original_ref: Option<String>,
450 #[serde(skip_serializing_if = "Option::is_none")]
451 pub title: Option<String>,
452 #[serde(skip_serializing_if = "Option::is_none")]
453 pub description: Option<String>,
454 #[serde(skip_serializing_if = "Option::is_none")]
455 #[serde(rename = "type")]
456 pub r#type: Option<String>,
457 #[serde(skip_serializing_if = "Option::is_none")]
458 pub format: Option<String>,
459 #[serde(skip_serializing_if = "Option::is_none")]
460 #[serde(rename = "enum")]
461 pub r#enum: Option<Vec<String>>,
462 #[serde(skip_serializing_if = "Option::is_none")]
463 pub required: Option<Vec<String>>,
464
465 #[serde(skip_serializing_if = "Option::is_none")]
466 pub default: Option<Value>,
467 #[serde(skip_serializing_if = "Option::is_none")]
468 pub maximum: Option<Number>,
469 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
470 pub exclusive_maximum: Option<bool>,
471 #[serde(skip_serializing_if = "Option::is_none")]
472 pub minimum: Option<Number>,
473 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
474 pub exclusive_minimum: Option<bool>,
475 #[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
476 pub max_length: Option<Number>,
477 #[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
478 pub min_length: Option<Number>,
479 #[serde(skip_serializing_if = "Option::is_none")]
480 pub pattern: Option<String>,
481 #[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
482 pub max_items: Option<Number>,
483 #[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
484 pub min_items: Option<Number>,
485 #[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
486 pub unique_items: Option<bool>,
487 #[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
488 pub multiple_of: Option<Number>,
489 #[serde(skip_serializing_if = "Option::is_none")]
490 pub items: Option<Box<Schema>>,
491 #[serde(skip_serializing_if = "Option::is_none")]
493 pub properties: Option<BTreeMap<String, Schema>>,
494
495 #[serde(
496 skip_serializing_if = "Option::is_none",
497 rename = "additionalProperties"
498 )]
499 pub additional_properties: Option<Value>,
500
501 #[serde(skip_serializing_if = "Option::is_none")]
503 pub discriminator: Option<Discriminator>,
504
505 #[serde(skip_serializing_if = "Option::is_none", rename = "readOnly")]
507 pub read_only: Option<bool>,
508 #[serde(skip_serializing_if = "Option::is_none")]
510 pub xml: Option<XML>,
511 #[serde(skip_serializing_if = "Option::is_none", rename = "externalDocs")]
513 pub external_docs: Option<ExternalDoc>,
514 #[serde(skip_serializing_if = "Option::is_none")]
516 pub example: Option<Value>,
517 #[serde(skip_serializing_if = "Option::is_none")]
519 #[serde(rename = "allOf")]
520 pub all_of: Option<Vec<Box<Schema>>>,
521 #[serde(flatten)]
523 pub extensions: BTreeMap<String, serde_json::Value>,
524}
525
526#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
528#[serde(rename_all = "lowercase")]
529pub enum ParameterType {
530 String,
531 Number,
532 Integer,
533 Boolean,
534 Array,
535 File,
536}
537#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
540pub struct XML {
541 #[serde(skip_serializing_if = "Option::is_none")]
543 pub name: Option<String>,
544 #[serde(skip_serializing_if = "Option::is_none")]
546 pub namespace: Option<String>,
547 #[serde(skip_serializing_if = "Option::is_none")]
549 pub prefix: Option<String>,
550 #[serde(skip_serializing_if = "Option::is_none")]
552 pub attribute: Option<bool>,
553 #[serde(skip_serializing_if = "Option::is_none")]
555 pub wrapped: Option<bool>,
556}
557#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
558#[serde(rename_all = "lowercase")]
559pub enum ItemsType {
560 String,
561 Number,
562 Integer,
563 Boolean,
564 Array,
565}
566#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
569pub struct Items {
570 pub r#type: ItemsType,
572
573 #[serde(skip_serializing_if = "Option::is_none")]
575 pub format: Option<String>,
576
577 #[serde(skip_serializing_if = "Option::is_none")]
579 pub items: Option<Box<Items>>,
580
581 #[serde(skip_serializing_if = "Option::is_none", rename = "collectionFormat")]
583 pub collection_format: Option<String>,
584
585 #[serde(skip_serializing_if = "Option::is_none")]
588 pub default: Option<Value>,
589 #[serde(skip_serializing_if = "Option::is_none")]
590 pub maximum: Option<Number>,
591 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
592 pub exclusive_maximum: Option<bool>,
593 #[serde(skip_serializing_if = "Option::is_none")]
594 pub minimum: Option<Number>,
595 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
596 pub exclusive_minimum: Option<bool>,
597 #[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
598 pub max_length: Option<Number>,
599 #[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
600 pub min_length: Option<Number>,
601 #[serde(skip_serializing_if = "Option::is_none")]
602 pub pattern: Option<String>,
603 #[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
604 pub max_items: Option<Number>,
605 #[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
606 pub min_items: Option<Number>,
607 #[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
608 pub unique_items: Option<bool>,
609 #[serde(skip_serializing_if = "Option::is_none")]
610 pub r#enum: Option<Vec<Value>>,
611 #[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
612 pub multiple_of: Option<Number>,
613 #[serde(flatten)]
614 pub extensions: Extensions,
615}
616
617pub type Responses = BTreeMap<String, ResponseOrRef>;
621
622#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
625pub struct Response {
626 pub description: String,
628 #[serde(skip_serializing_if = "Option::is_none")]
630 pub schema: Option<Schema>,
631 #[serde(skip_serializing_if = "Option::is_none")]
633 pub headers: Option<BTreeMap<String, Header>>,
634 #[serde(skip_serializing_if = "Option::is_none")]
636 pub examples: Option<BTreeMap<String, Value>>,
637 #[serde(flatten)]
638 pub extensions: Extensions,
639}
640
641#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
643pub struct Header {
644 #[serde(skip_serializing_if = "Option::is_none")]
646 pub description: Option<String>,
647 pub r#type: ItemsType,
649
650 #[serde(skip_serializing_if = "Option::is_none")]
652 pub format: Option<String>,
653
654 #[serde(skip_serializing_if = "Option::is_none")]
656 pub items: Option<Box<Items>>,
657
658 #[serde(skip_serializing_if = "Option::is_none", rename = "collectionFormat")]
660 pub collection_format: Option<String>,
661
662 #[serde(skip_serializing_if = "Option::is_none")]
665 pub default: Option<Value>,
666 #[serde(skip_serializing_if = "Option::is_none")]
667 pub maximum: Option<Number>,
668 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMaximum")]
669 pub exclusive_maximum: Option<bool>,
670 #[serde(skip_serializing_if = "Option::is_none")]
671 pub minimum: Option<Number>,
672 #[serde(skip_serializing_if = "Option::is_none", rename = "exclusiveMinimum")]
673 pub exclusive_minimum: Option<bool>,
674 #[serde(skip_serializing_if = "Option::is_none", rename = "maxLength")]
675 pub max_length: Option<Value>,
676 #[serde(skip_serializing_if = "Option::is_none", rename = "minLength")]
677 pub min_length: Option<Number>,
678 #[serde(skip_serializing_if = "Option::is_none")]
679 pub pattern: Option<String>,
680 #[serde(skip_serializing_if = "Option::is_none", rename = "maxItems")]
681 pub max_items: Option<Number>,
682 #[serde(skip_serializing_if = "Option::is_none", rename = "minItems")]
683 pub min_items: Option<Number>,
684 #[serde(skip_serializing_if = "Option::is_none", rename = "uniqueItems")]
685 pub unique_items: Option<bool>,
686 #[serde(skip_serializing_if = "Option::is_none")]
687 pub r#enum: Option<Vec<Value>>,
688 #[serde(skip_serializing_if = "Option::is_none", rename = "multipleOf")]
689 pub multiple_of: Option<Number>,
690 #[serde(flatten)]
691 pub extensions: Extensions,
692}
693
694#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
695#[serde(untagged)]
696pub enum ResponseOrRef {
697 Response {
698 description: String,
699 schema: Option<Schema>,
700 headers: Option<BTreeMap<String, Header>>,
701 examples: Option<BTreeMap<String, Value>>,
702 #[serde(flatten)]
703 extensions: Extensions,
704 },
705 Ref {
706 #[serde(rename = "$ref")]
707 reference: String,
708 },
709}
710
711#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
714pub struct Discriminator {
715 #[serde(rename = "propertyName")]
717 pub property_name: String,
718 #[serde(skip_serializing_if = "Option::is_none")]
720 pub mapping: Option<BTreeMap<String, String>>,
721}
722
723#[cfg(test)]
724mod test {
725 use super::*;
726 use serde_json;
727 #[test]
728 fn parameter_or_ref_dese() {
729 let json_str = r#"{
730 "$ref":"/some/path"
731 }"#;
732
733 assert_eq!(
734 serde_json::from_str::<ParameterOrRef>(&json_str).unwrap(),
735 ParameterOrRef::Ref(Reference {
736 reference: "/some/path".to_string()
737 })
738 )
739 }
740}