openapi3_parser/
open_api.rs

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")] // in is a reserved keyword in Rust
59    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")] // type is a reserved keyword in Rust
147    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>, // `in` is renamed to `in_` in Rust
182    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}