1use serde::{Deserialize, Serialize};
4use serde_json;
5use super::{Parameter, SecurityScheme};
6
7#[derive(Debug, Clone, Serialize, Deserialize, Default)]
9pub struct Components {
10 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
12 pub schemas: std::collections::BTreeMap<String, crate::Schema>,
13 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
15 pub responses: std::collections::BTreeMap<String, Response>,
16 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
18 pub parameters: std::collections::BTreeMap<String, Parameter>,
19 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
21 pub examples: std::collections::BTreeMap<String, Example>,
22 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
24 pub request_bodies: std::collections::BTreeMap<String, RequestBody>,
25 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
27 pub headers: std::collections::BTreeMap<String, Header>,
28 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
30 pub security_schemes: std::collections::BTreeMap<String, SecurityScheme>,
31 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
33 pub links: std::collections::BTreeMap<String, Link>,
34 #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
36 pub callbacks: std::collections::BTreeMap<String, Callback>,
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct Response {
42 pub description: String,
44 #[serde(skip_serializing_if = "Option::is_none")]
46 pub content: Option<std::collections::BTreeMap<String, MediaType>>,
47 #[serde(skip_serializing_if = "Option::is_none")]
49 pub headers: Option<std::collections::BTreeMap<String, HeaderOrReference>>,
50 #[serde(skip_serializing_if = "Option::is_none")]
52 pub links: Option<std::collections::BTreeMap<String, LinkOrReference>>,
53}
54
55impl Response {
56 pub fn new(description: impl Into<String>) -> Self {
58 Self { description: description.into(), content: None, headers: None, links: None }
59 }
60
61 pub fn json(mut self, schema: crate::Schema) -> Self {
63 let content = self.content.get_or_insert_with(std::collections::BTreeMap::new);
64 content.insert(
65 "application/json".to_string(),
66 MediaType { schema: Some(schema), example: None, examples: None, encoding: None },
67 );
68 self
69 }
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct RequestBody {
75 #[serde(skip_serializing_if = "Option::is_none")]
77 pub description: Option<String>,
78 pub content: std::collections::BTreeMap<String, MediaType>,
80 #[serde(default)]
82 pub required: bool,
83}
84
85impl RequestBody {
86 pub fn json(schema: crate::Schema) -> Self {
88 let mut content = std::collections::BTreeMap::new();
89 content.insert(
90 "application/json".to_string(),
91 MediaType { schema: Some(schema), example: None, examples: None, encoding: None },
92 );
93 Self { description: None, content, required: true }
94 }
95
96 pub fn description(mut self, desc: impl Into<String>) -> Self {
98 self.description = Some(desc.into());
99 self
100 }
101
102 pub fn required(mut self, required: bool) -> Self {
104 self.required = required;
105 self
106 }
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct MediaType {
112 #[serde(skip_serializing_if = "Option::is_none")]
114 pub schema: Option<crate::Schema>,
115 #[serde(skip_serializing_if = "Option::is_none")]
117 pub example: Option<serde_json::Value>,
118 #[serde(skip_serializing_if = "Option::is_none")]
120 pub examples: Option<std::collections::BTreeMap<String, ExampleOrReference>>,
121 #[serde(skip_serializing_if = "Option::is_none")]
123 pub encoding: Option<std::collections::BTreeMap<String, Encoding>>,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize)]
128pub struct Encoding {
129 #[serde(skip_serializing_if = "Option::is_none")]
131 pub content_type: Option<String>,
132 #[serde(skip_serializing_if = "Option::is_none")]
134 pub headers: Option<std::collections::BTreeMap<String, HeaderOrReference>>,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub style: Option<String>,
138 #[serde(default)]
140 pub explode: bool,
141 #[serde(default)]
143 pub allow_reserved: bool,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct Header {
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub description: Option<String>,
152 #[serde(default)]
154 pub required: bool,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub schema: Option<crate::Schema>,
158 #[serde(default)]
160 pub deprecated: bool,
161 #[serde(skip_serializing_if = "Option::is_none")]
163 pub example: Option<serde_json::Value>,
164 #[serde(skip_serializing_if = "Option::is_none")]
166 pub examples: Option<std::collections::BTreeMap<String, ExampleOrReference>>,
167}
168
169#[derive(Debug, Clone, Serialize, Deserialize)]
171pub struct Example {
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub summary: Option<String>,
175 #[serde(skip_serializing_if = "Option::is_none")]
177 pub description: Option<String>,
178 #[serde(skip_serializing_if = "Option::is_none")]
180 pub value: Option<serde_json::Value>,
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub external_value: Option<String>,
184}
185
186#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct Link {
189 #[serde(skip_serializing_if = "Option::is_none")]
191 pub operation_ref: Option<String>,
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub operation_id: Option<String>,
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub parameters: Option<std::collections::BTreeMap<String, serde_json::Value>>,
198 #[serde(skip_serializing_if = "Option::is_none")]
200 pub request_body: Option<serde_json::Value>,
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub description: Option<String>,
204 #[serde(skip_serializing_if = "Option::is_none")]
206 pub server: Option<super::Server>,
207}
208
209#[derive(Debug, Clone, Serialize, Deserialize)]
211pub struct Callback {
212 #[serde(flatten)]
214 pub paths: std::collections::BTreeMap<String, super::PathItem>,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
219pub struct Reference {
220 #[serde(rename = "$ref")]
222 pub ref_path: String,
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize)]
227#[serde(untagged)]
228pub enum HeaderOrReference {
229 Header(Header),
231 Reference(Reference),
233}
234
235#[derive(Debug, Clone, Serialize, Deserialize)]
237#[serde(untagged)]
238pub enum ExampleOrReference {
239 Example(Example),
241 Reference(Reference),
243}
244
245#[derive(Debug, Clone, Serialize, Deserialize)]
247#[serde(untagged)]
248pub enum LinkOrReference {
249 Link(Link),
251 Reference(Reference),
253}
254
255#[derive(Debug, Clone, Serialize, Deserialize)]
257#[serde(untagged)]
258pub enum ResponseOrReference {
259 Response(Response),
261 Reference(Reference),
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize)]
267#[serde(untagged)]
268pub enum RequestBodyOrReference {
269 RequestBody(RequestBody),
271 Reference(Reference),
273}