Skip to main content

wae_schema/openapi/
components.rs

1//! OpenAPI 组件定义
2
3use serde::{Deserialize, Serialize};
4use serde_json;
5use super::{Parameter, SecurityScheme};
6
7/// 组件定义
8#[derive(Debug, Clone, Serialize, Deserialize, Default)]
9pub struct Components {
10    /// Schema 定义
11    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
12    pub schemas: std::collections::BTreeMap<String, crate::Schema>,
13    /// 响应定义
14    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
15    pub responses: std::collections::BTreeMap<String, Response>,
16    /// 参数定义
17    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
18    pub parameters: std::collections::BTreeMap<String, Parameter>,
19    /// 示例定义
20    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
21    pub examples: std::collections::BTreeMap<String, Example>,
22    /// 请求体定义
23    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
24    pub request_bodies: std::collections::BTreeMap<String, RequestBody>,
25    /// 头部定义
26    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
27    pub headers: std::collections::BTreeMap<String, Header>,
28    /// 安全方案定义
29    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
30    pub security_schemes: std::collections::BTreeMap<String, SecurityScheme>,
31    /// 链接定义
32    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
33    pub links: std::collections::BTreeMap<String, Link>,
34    /// 回调定义
35    #[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
36    pub callbacks: std::collections::BTreeMap<String, Callback>,
37}
38
39/// 响应定义
40#[derive(Debug, Clone, Serialize, Deserialize)]
41pub struct Response {
42    /// 响应描述
43    pub description: String,
44    /// 内容定义
45    #[serde(skip_serializing_if = "Option::is_none")]
46    pub content: Option<std::collections::BTreeMap<String, MediaType>>,
47    /// 响应头
48    #[serde(skip_serializing_if = "Option::is_none")]
49    pub headers: Option<std::collections::BTreeMap<String, HeaderOrReference>>,
50    /// 链接
51    #[serde(skip_serializing_if = "Option::is_none")]
52    pub links: Option<std::collections::BTreeMap<String, LinkOrReference>>,
53}
54
55impl Response {
56    /// 创建新响应
57    pub fn new(description: impl Into<String>) -> Self {
58        Self { description: description.into(), content: None, headers: None, links: None }
59    }
60
61    /// 添加 JSON 响应
62    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/// 请求体定义
73#[derive(Debug, Clone, Serialize, Deserialize)]
74pub struct RequestBody {
75    /// 请求体描述
76    #[serde(skip_serializing_if = "Option::is_none")]
77    pub description: Option<String>,
78    /// 内容定义
79    pub content: std::collections::BTreeMap<String, MediaType>,
80    /// 是否必需
81    #[serde(default)]
82    pub required: bool,
83}
84
85impl RequestBody {
86    /// 创建 JSON 请求体
87    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    /// 设置描述
97    pub fn description(mut self, desc: impl Into<String>) -> Self {
98        self.description = Some(desc.into());
99        self
100    }
101
102    /// 设置是否必需
103    pub fn required(mut self, required: bool) -> Self {
104        self.required = required;
105        self
106    }
107}
108
109/// 媒体类型定义
110#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct MediaType {
112    /// Schema
113    #[serde(skip_serializing_if = "Option::is_none")]
114    pub schema: Option<crate::Schema>,
115    /// 示例
116    #[serde(skip_serializing_if = "Option::is_none")]
117    pub example: Option<serde_json::Value>,
118    /// 多个示例
119    #[serde(skip_serializing_if = "Option::is_none")]
120    pub examples: Option<std::collections::BTreeMap<String, ExampleOrReference>>,
121    /// 编码定义
122    #[serde(skip_serializing_if = "Option::is_none")]
123    pub encoding: Option<std::collections::BTreeMap<String, Encoding>>,
124}
125
126/// 编码定义
127#[derive(Debug, Clone, Serialize, Deserialize)]
128pub struct Encoding {
129    /// 内容类型
130    #[serde(skip_serializing_if = "Option::is_none")]
131    pub content_type: Option<String>,
132    /// 请求头
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub headers: Option<std::collections::BTreeMap<String, HeaderOrReference>>,
135    /// 样式
136    #[serde(skip_serializing_if = "Option::is_none")]
137    pub style: Option<String>,
138    /// 是否展开
139    #[serde(default)]
140    pub explode: bool,
141    /// 是否允许保留字符
142    #[serde(default)]
143    pub allow_reserved: bool,
144}
145
146/// 头部定义
147#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct Header {
149    /// 头部描述
150    #[serde(skip_serializing_if = "Option::is_none")]
151    pub description: Option<String>,
152    /// 是否必需
153    #[serde(default)]
154    pub required: bool,
155    /// Schema
156    #[serde(skip_serializing_if = "Option::is_none")]
157    pub schema: Option<crate::Schema>,
158    /// 是否废弃
159    #[serde(default)]
160    pub deprecated: bool,
161    /// 示例值
162    #[serde(skip_serializing_if = "Option::is_none")]
163    pub example: Option<serde_json::Value>,
164    /// 多个示例
165    #[serde(skip_serializing_if = "Option::is_none")]
166    pub examples: Option<std::collections::BTreeMap<String, ExampleOrReference>>,
167}
168
169/// 示例定义
170#[derive(Debug, Clone, Serialize, Deserialize)]
171pub struct Example {
172    /// 示例摘要
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub summary: Option<String>,
175    /// 示例描述
176    #[serde(skip_serializing_if = "Option::is_none")]
177    pub description: Option<String>,
178    /// 示例值
179    #[serde(skip_serializing_if = "Option::is_none")]
180    pub value: Option<serde_json::Value>,
181    /// 外部示例值 URL
182    #[serde(skip_serializing_if = "Option::is_none")]
183    pub external_value: Option<String>,
184}
185
186/// 链接定义
187#[derive(Debug, Clone, Serialize, Deserialize)]
188pub struct Link {
189    /// 链接操作引用
190    #[serde(skip_serializing_if = "Option::is_none")]
191    pub operation_ref: Option<String>,
192    /// 链接操作 ID
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub operation_id: Option<String>,
195    /// 链接参数
196    #[serde(skip_serializing_if = "Option::is_none")]
197    pub parameters: Option<std::collections::BTreeMap<String, serde_json::Value>>,
198    /// 链接请求体
199    #[serde(skip_serializing_if = "Option::is_none")]
200    pub request_body: Option<serde_json::Value>,
201    /// 链接描述
202    #[serde(skip_serializing_if = "Option::is_none")]
203    pub description: Option<String>,
204    /// 链接服务器
205    #[serde(skip_serializing_if = "Option::is_none")]
206    pub server: Option<super::Server>,
207}
208
209/// 回调定义
210#[derive(Debug, Clone, Serialize, Deserialize)]
211pub struct Callback {
212    /// 回调路径项
213    #[serde(flatten)]
214    pub paths: std::collections::BTreeMap<String, super::PathItem>,
215}
216
217/// 引用对象
218#[derive(Debug, Clone, Serialize, Deserialize)]
219pub struct Reference {
220    /// 引用地址
221    #[serde(rename = "$ref")]
222    pub ref_path: String,
223}
224
225/// 头部或引用
226#[derive(Debug, Clone, Serialize, Deserialize)]
227#[serde(untagged)]
228pub enum HeaderOrReference {
229    /// 头部对象
230    Header(Header),
231    /// 引用对象
232    Reference(Reference),
233}
234
235/// 示例或引用
236#[derive(Debug, Clone, Serialize, Deserialize)]
237#[serde(untagged)]
238pub enum ExampleOrReference {
239    /// 示例对象
240    Example(Example),
241    /// 引用对象
242    Reference(Reference),
243}
244
245/// 链接或引用
246#[derive(Debug, Clone, Serialize, Deserialize)]
247#[serde(untagged)]
248pub enum LinkOrReference {
249    /// 链接对象
250    Link(Link),
251    /// 引用对象
252    Reference(Reference),
253}
254
255/// 响应或引用
256#[derive(Debug, Clone, Serialize, Deserialize)]
257#[serde(untagged)]
258pub enum ResponseOrReference {
259    /// 响应对象
260    Response(Response),
261    /// 引用对象
262    Reference(Reference),
263}
264
265/// 请求体或引用
266#[derive(Debug, Clone, Serialize, Deserialize)]
267#[serde(untagged)]
268pub enum RequestBodyOrReference {
269    /// 请求体对象
270    RequestBody(RequestBody),
271    /// 引用对象
272    Reference(Reference),
273}