1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Serialize, Deserialize, Debug)]
5#[serde(rename_all = "camelCase")]
6pub struct OpenApiSpec {
7 pub openapi: Option<String>,
8 pub info: Option<Info>,
9 pub paths: Option<HashMap<String, PathItem>>,
10 pub components: Option<Components>,
11 pub servers: Option<Vec<Server>>,
12}
13
14#[derive(Serialize, Deserialize, Debug)]
15#[serde(rename_all = "camelCase")]
16pub struct Info {
17 pub title: Option<String>,
18 pub description: Option<String>,
19 pub version: Option<String>,
20}
21
22#[derive(Serialize, Deserialize, Debug)]
23#[serde(rename_all = "camelCase")]
24pub struct Server {
25 pub url: Option<String>,
26 pub description: Option<String>,
27}
28
29#[derive(Serialize, Deserialize, Debug)]
30#[serde(rename_all = "camelCase")]
31pub struct PathItem {
32 pub get: Option<Operation>,
33 pub post: Option<Operation>,
34 pub put: Option<Operation>,
35 pub delete: Option<Operation>,
36 pub patch: Option<Operation>,
37 pub options: Option<Operation>,
38 pub head: Option<Operation>,
39 pub trace: Option<Operation>,
40}
41
42#[derive(Serialize, Deserialize, Debug)]
43#[serde(rename_all = "camelCase")]
44pub struct Operation {
45 pub tags: Option<Vec<String>>,
46 pub summary: Option<String>,
47 pub description: Option<String>,
48 pub operation_id: Option<String>,
49 pub parameters: Option<Vec<Parameter>>,
50 pub request_body: Option<RequestBody>,
51 pub responses: Option<Responses>,
52}
53
54#[derive(Serialize, Deserialize, Debug)]
55#[serde(rename_all = "camelCase")]
56pub struct Parameter {
57 pub name: Option<String>,
58 #[serde(rename = "in")] pub in_: Option<String>,
60 pub required: Option<bool>,
61 pub schema: Option<Schema>,
62 pub description: Option<String>,
63 pub example: Option<serde_json::Value>,
64 pub examples: Option<HashMap<String, Example>>,
65}
66
67#[derive(Serialize, Deserialize, Debug)]
68#[serde(rename_all = "camelCase")]
69pub struct RequestBody {
70 pub content: Option<HashMap<String, MediaType>>,
71 pub description: Option<String>,
72 pub required: Option<bool>,
73}
74
75#[derive(Serialize, Deserialize, Debug)]
76#[serde(rename_all = "camelCase")]
77pub struct MediaType {
78 pub schema: Option<Schema>,
79 pub example: Option<serde_json::Value>,
80 pub examples: Option<HashMap<String, Example>>,
81}
82
83#[derive(Serialize, Deserialize, Debug)]
84#[serde(rename_all = "camelCase")]
85pub struct Responses {
86 #[serde(flatten)]
87 pub responses: Option<HashMap<String, Response>>,
88 pub default: Option<Response>,
89}
90
91#[derive(Serialize, Deserialize, Debug)]
92#[serde(rename_all = "camelCase")]
93pub struct Response {
94 pub description: Option<String>,
95 pub content: Option<HashMap<String, MediaType>>,
96 pub headers: Option<HashMap<String, Header>>,
97}
98
99#[derive(Serialize, Deserialize, Debug)]
100#[serde(rename_all = "camelCase")]
101pub struct Header {
102 pub description: Option<String>,
103 pub schema: Option<Schema>,
104 pub example: Option<serde_json::Value>,
105}
106
107#[derive(Serialize, Deserialize, Debug)]
108#[serde(rename_all = "camelCase")]
109pub struct Components {
110 pub schemas: Option<HashMap<String, Schema>>,
111 pub responses: Option<HashMap<String, Response>>,
112 pub parameters: Option<HashMap<String, Parameter>>,
113 pub examples: Option<HashMap<String, Example>>,
114 pub request_bodies: Option<HashMap<String, RequestBody>>,
115 pub headers: Option<HashMap<String, Header>>,
116 pub security_schemes: Option<HashMap<String, SecurityScheme>>,
117}
118
119#[derive(Serialize, Deserialize, Debug)]
120#[serde(rename_all = "camelCase")]
121pub struct Example {
122 pub summary: Option<String>,
123 pub description: Option<String>,
124 pub value: Option<serde_json::Value>,
125 pub external_value: Option<String>,
126}
127
128#[derive(Serialize, Deserialize, Debug)]
129#[serde(rename_all = "camelCase")]
130pub struct Schema {
131 pub title: Option<String>,
132 pub multiple_of: Option<f64>,
133 pub maximum: Option<f64>,
134 pub exclusive_maximum: Option<bool>,
135 pub minimum: Option<f64>,
136 pub exclusive_minimum: Option<bool>,
137 pub max_length: Option<u32>,
138 pub min_length: Option<u32>,
139 pub pattern: Option<String>,
140 pub max_items: Option<u32>,
141 pub min_items: Option<u32>,
142 pub unique_items: Option<bool>,
143 pub max_properties: Option<u32>,
144 pub min_properties: Option<u32>,
145 pub required: Option<Vec<String>>,
146 #[serde(rename = "type")] pub type_: Option<String>,
148 pub not: Option<Box<Schema>>,
149 pub all_of: Option<Vec<Schema>>,
150 pub one_of: Option<Vec<Schema>>,
151 pub any_of: Option<Vec<Schema>>,
152 pub items: Option<Box<Schema>>,
153 pub properties: Option<HashMap<String, Schema>>,
154 pub additional_properties: Option<Box<Schema>>,
155 pub description: Option<String>,
156 pub format: Option<String>,
157 pub default: Option<serde_json::Value>,
158 pub nullable: Option<bool>,
159 pub discriminator: Option<Discriminator>,
160 pub read_only: Option<bool>,
161 pub write_only: Option<bool>,
162 pub xml: Option<XML>,
163 pub example: Option<serde_json::Value>,
164 pub deprecated: Option<bool>,
165}
166
167#[derive(Serialize, Deserialize, Debug)]
168#[serde(rename_all = "camelCase")]
169pub struct Discriminator {
170 pub property_name: Option<String>,
171 pub mapping: Option<HashMap<String, String>>,
172}
173
174#[derive(Serialize, Deserialize, Debug)]
175#[serde(rename_all = "camelCase")]
176pub struct SecurityScheme {
177 #[serde(rename = "type")]
178 pub type_: Option<String>,
179 pub description: Option<String>,
180 pub name: Option<String>,
181 pub in_: Option<String>, pub scheme: Option<String>,
183 pub bearer_format: Option<String>,
184 pub flows: Option<OAuthFlows>,
185 pub open_id_connect_url: Option<String>,
186}
187
188#[derive(Serialize, Deserialize, Debug)]
189#[serde(rename_all = "camelCase")]
190pub struct OAuthFlows {
191 pub implicit: Option<OAuthFlow>,
192 pub password: Option<OAuthFlow>,
193 pub client_credentials: Option<OAuthFlow>,
194 pub authorization_code: Option<OAuthFlow>,
195}
196
197#[derive(Serialize, Deserialize, Debug)]
198#[serde(rename_all = "camelCase")]
199pub struct OAuthFlow {
200 pub authorization_url: Option<String>,
201 pub token_url: Option<String>,
202 pub refresh_url: Option<String>,
203 pub scopes: Option<HashMap<String, String>>,
204}
205
206#[derive(Serialize, Deserialize, Debug)]
207#[serde(rename_all = "camelCase")]
208pub struct XML {
209 pub name: Option<String>,
210 pub namespace: Option<String>,
211 pub prefix: Option<String>,
212 pub attribute: Option<bool>,
213 pub wrapped: Option<bool>,
214}