openapi/
schema.rs

1use std::collections::BTreeMap;
2
3/// top level document
4#[derive(Debug, Deserialize, Serialize, PartialEq)]
5pub struct Spec {
6    /// version string
7    pub swagger: String,
8    pub info: Info,
9    pub paths: BTreeMap<String, Operations>, // / -> get -> op
10    pub definitions: BTreeMap<String, Schema>,
11    #[serde(skip_serializing_if="Option::is_none")]
12    pub schemes: Option<Vec<String>>,
13    #[serde(skip_serializing_if="Option::is_none")]
14    pub host: Option<String>,
15    #[serde(skip_serializing_if="Option::is_none")]
16    #[serde(rename="basePath")]
17    pub base_path: Option<String>,
18    #[serde(skip_serializing_if="Option::is_none")]
19    pub consumes: Option<Vec<String>>,
20    #[serde(skip_serializing_if="Option::is_none")]
21    pub produces: Option<Vec<String>>,
22    #[serde(skip_serializing_if="Option::is_none")]
23    pub parameters: Option<BTreeMap<String, Parameter>>,
24    #[serde(skip_serializing_if="Option::is_none")]
25    pub responses: Option<BTreeMap<String, Response>>,
26    #[serde(skip_serializing_if="Option::is_none")]
27    #[serde(rename="securityDefinitions")]
28    pub security_definitions: Option<BTreeMap<String, Security>>,
29    #[serde(skip_serializing_if="Option::is_none")]
30    pub tags: Option<Vec<Tag>>,
31}
32
33
34#[derive(Debug, Deserialize, Serialize, PartialEq)]
35pub struct Tag {
36    pub name: String,
37    #[serde(skip_serializing_if="Option::is_none")]
38    pub description: Option<String>,
39    #[serde(skip_serializing_if="Option::is_none")]
40    #[serde(rename="externalDocs")]
41    pub external_docs: Option<Vec<ExternalDoc>>,
42}
43
44#[derive(Debug, Deserialize, Serialize, PartialEq)]
45pub struct ExternalDoc {
46    pub url: String,
47    #[serde(skip_serializing_if="Option::is_none")]
48    pub description: Option<String>,
49}
50
51#[derive(Debug, Deserialize, Serialize, PartialEq)]
52pub struct Info {
53    pub title: String,
54    pub version: String,
55    #[serde(skip_serializing_if="Option::is_none")]
56    #[serde(rename="termsOfService")]
57    pub terms_of_service: Option<String>,
58}
59
60#[derive(Debug, Deserialize, Serialize, PartialEq)]
61pub struct Operations {
62    #[serde(skip_serializing_if="Option::is_none")]
63    pub get: Option<Operation>,
64    #[serde(skip_serializing_if="Option::is_none")]
65    pub post: Option<Operation>,
66    #[serde(skip_serializing_if="Option::is_none")]
67    pub put: Option<Operation>,
68    #[serde(skip_serializing_if="Option::is_none")]
69    pub patch: Option<Operation>,
70    #[serde(skip_serializing_if="Option::is_none")]
71    pub delete: Option<Operation>,
72    #[serde(skip_serializing_if="Option::is_none")]
73    pub parameters: Option<Vec<Parameter>>,
74}
75
76#[derive(Debug, Deserialize, Serialize, PartialEq)]
77pub struct Operation {
78    #[serde(skip_serializing_if="Option::is_none")]
79    pub summary: Option<String>,
80    #[serde(skip_serializing_if="Option::is_none")]
81    pub description: Option<String>,
82    #[serde(skip_serializing_if="Option::is_none")]
83    pub consumes: Option<Vec<String>>,
84    #[serde(skip_serializing_if="Option::is_none")]
85    pub produces: Option<Vec<String>>,
86    #[serde(skip_serializing_if="Option::is_none")]
87    pub schemes: Option<Vec<String>>,
88    #[serde(skip_serializing_if="Option::is_none")]
89    pub tags: Option<Vec<String>>,
90    #[serde(skip_serializing_if="Option::is_none")]
91    #[serde(rename="operationId")]
92    pub operation_id: Option<String>,
93    pub responses: BTreeMap<String, Response>,
94    #[serde(skip_serializing_if="Option::is_none")]
95    pub parameters: Option<Vec<Parameter>>,
96}
97
98#[derive(Debug, Deserialize, Serialize, PartialEq)]
99pub struct Parameter {
100    pub name: String,
101    #[serde(rename="in")]
102    pub location: String,
103    #[serde(skip_serializing_if="Option::is_none")]
104    pub required: Option<bool>,
105    #[serde(skip_serializing_if="Option::is_none")]
106    pub schema: Option<Schema>,
107    #[serde(skip_serializing_if="Option::is_none")]
108    #[serde(rename="uniqueItems")]
109    pub unique_items: Option<bool>,
110    #[serde(skip_serializing_if="Option::is_none")]
111    #[serde(rename="type")]
112    pub param_type: Option<String>,
113    #[serde(skip_serializing_if="Option::is_none")]
114    pub format: Option<String>,
115}
116
117#[derive(Debug, Deserialize, Serialize, PartialEq)]
118pub struct Response {
119    pub description: String,
120    #[serde(skip_serializing_if="Option::is_none")]
121    pub schema: Option<Schema>,
122}
123
124#[derive(Debug, Deserialize, Serialize, PartialEq)]
125pub struct Security {
126    #[serde(rename="type")]
127    pub security_type: String, // todo:
128}
129
130/// A [JSON schema](http://json-schema.org/) definition describing
131/// the shape and properties of an object.
132///
133/// This may also contain a `$ref` to another definition
134#[derive(Debug, Deserialize, Serialize, PartialEq)]
135pub struct Schema {
136    #[serde(skip_serializing_if="Option::is_none")]
137    /// a [JSON reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03)
138    /// path to another defintion
139    #[serde(rename="$ref")]
140    pub ref_path: Option<String>,
141    #[serde(skip_serializing_if="Option::is_none")]
142    pub description: Option<String>,
143    #[serde(skip_serializing_if="Option::is_none")]
144    #[serde(rename="type")]
145    pub schema_type: Option<String>,
146    #[serde(skip_serializing_if="Option::is_none")]
147    pub format: Option<String>,
148    #[serde(skip_serializing_if="Option::is_none")]
149    #[serde(rename="enum")]
150    pub enum_values: Option<Vec<String>>,
151    #[serde(skip_serializing_if="Option::is_none")]
152    pub required: Option<Vec<String>>,
153    #[serde(skip_serializing_if="Option::is_none")]
154    pub items: Option<Box<Schema>>, // if scheme_type array (box is for recursion)
155    #[serde(skip_serializing_if="Option::is_none")]
156    pub properties: Option<BTreeMap<String, Schema>>, // implies object
157}