1use serde::{Deserialize, Serialize};
8
9use crate::diagnostic::SpecLocation;
10use crate::value::ValueRef;
11
12pub type TypeRef = String;
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16pub struct NamedType {
17 pub id: String,
18 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub original_name: Option<String>,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub title: Option<String>,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub description: Option<String>,
26 #[serde(default, skip_serializing_if = "crate::is_false")]
28 pub deprecated: bool,
29 #[serde(default, skip_serializing_if = "crate::is_false")]
33 pub read_only: bool,
34 #[serde(default, skip_serializing_if = "crate::is_false")]
38 pub write_only: bool,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub external_docs: Option<crate::ExternalDocs>,
42 #[serde(default, skip_serializing_if = "Option::is_none")]
45 pub default: Option<ValueRef>,
46 #[serde(default, skip_serializing_if = "Vec::is_empty")]
49 pub examples: Vec<(String, crate::Example)>,
50 #[serde(default, skip_serializing_if = "Option::is_none")]
53 pub xml: Option<crate::XmlObject>,
54 pub definition: TypeDef,
55 #[serde(default, skip_serializing_if = "Vec::is_empty")]
59 pub extensions: Vec<(String, ValueRef)>,
60 #[serde(default, skip_serializing_if = "Option::is_none")]
61 pub location: Option<SpecLocation>,
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
65#[serde(tag = "def", rename_all = "kebab-case")]
66pub enum TypeDef {
67 Primitive(PrimitiveType),
68 Object(ObjectType),
69 Array(ArrayType),
70 EnumString(EnumStringType),
71 EnumInt(EnumIntType),
72 Union(UnionType),
73 Null,
78 Any,
86}
87
88pub const NULL_ID: &str = "null";
90
91#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
94pub struct PrimitiveType {
95 pub kind: PrimitiveKind,
96 pub constraints: PrimitiveConstraints,
97}
98
99#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
109#[serde(rename_all = "kebab-case")]
110pub enum PrimitiveKind {
111 String,
113 Integer,
116 Number,
119 Bool,
121}
122
123#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
124pub struct PrimitiveConstraints {
125 #[serde(default, skip_serializing_if = "Option::is_none")]
126 pub minimum: Option<ValueRef>,
127 #[serde(default, skip_serializing_if = "Option::is_none")]
128 pub maximum: Option<ValueRef>,
129 #[serde(default, skip_serializing_if = "Option::is_none")]
130 pub exclusive_minimum: Option<ValueRef>,
131 #[serde(default, skip_serializing_if = "Option::is_none")]
132 pub exclusive_maximum: Option<ValueRef>,
133 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub multiple_of: Option<ValueRef>,
135 #[serde(default, skip_serializing_if = "Option::is_none")]
136 pub min_length: Option<u64>,
137 #[serde(default, skip_serializing_if = "Option::is_none")]
138 pub max_length: Option<u64>,
139 #[serde(default, skip_serializing_if = "Option::is_none")]
140 pub pattern: Option<String>,
141 #[serde(default, skip_serializing_if = "Option::is_none")]
142 pub format_extension: Option<String>,
143 #[serde(default, skip_serializing_if = "Option::is_none")]
148 pub content_encoding: Option<String>,
149 #[serde(default, skip_serializing_if = "Option::is_none")]
152 pub content_media_type: Option<String>,
153 #[serde(default, skip_serializing_if = "Option::is_none")]
158 pub content_schema: Option<TypeRef>,
159}
160
161#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
164pub struct ArrayType {
165 pub items: TypeRef,
166 pub constraints: ArrayConstraints,
167}
168
169#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
170pub struct ArrayConstraints {
171 #[serde(default, skip_serializing_if = "Option::is_none")]
172 pub min_items: Option<u64>,
173 #[serde(default, skip_serializing_if = "Option::is_none")]
174 pub max_items: Option<u64>,
175 #[serde(default)]
176 pub unique_items: bool,
177}
178
179#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
182pub struct ObjectType {
183 pub properties: Vec<Property>,
184 pub additional_properties: AdditionalProperties,
185 pub constraints: ObjectConstraints,
186}
187
188#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
189pub struct Property {
190 pub name: String,
191 #[serde(rename = "type")]
192 pub r#type: TypeRef,
193 #[serde(default)]
198 pub required: bool,
199 #[serde(default, skip_serializing_if = "Option::is_none")]
201 pub title: Option<String>,
202 #[serde(default, skip_serializing_if = "Option::is_none")]
204 pub description: Option<String>,
205 #[serde(default)]
207 pub deprecated: bool,
208 #[serde(default)]
209 pub read_only: bool,
210 #[serde(default)]
211 pub write_only: bool,
212 #[serde(default, skip_serializing_if = "Option::is_none")]
214 pub external_docs: Option<crate::ExternalDocs>,
215 #[serde(default, skip_serializing_if = "Option::is_none")]
218 pub default: Option<ValueRef>,
219 #[serde(default, skip_serializing_if = "Vec::is_empty")]
223 pub examples: Vec<(String, crate::Example)>,
224 #[serde(default, skip_serializing_if = "Vec::is_empty")]
228 pub extensions: Vec<(String, ValueRef)>,
229}
230
231#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
232#[serde(tag = "kind", rename_all = "kebab-case")]
233pub enum AdditionalProperties {
234 Forbidden,
235 Any,
236 Typed { r#type: TypeRef },
237}
238
239#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
240pub struct ObjectConstraints {
241 #[serde(default, skip_serializing_if = "Option::is_none")]
242 pub min_properties: Option<u64>,
243 #[serde(default, skip_serializing_if = "Option::is_none")]
244 pub max_properties: Option<u64>,
245}
246
247#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
250pub struct EnumStringType {
251 pub values: Vec<EnumStringValue>,
252}
253
254#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
258pub struct EnumStringValue {
259 pub value: String,
260}
261
262#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
263pub struct EnumIntType {
264 pub values: Vec<EnumIntValue>,
265 pub kind: IntKind,
266}
267
268#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
271pub struct EnumIntValue {
272 pub value: i64,
273}
274
275#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
276#[serde(rename_all = "kebab-case")]
277pub enum IntKind {
278 Int32,
279 Int64,
280}
281
282#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
285pub struct UnionType {
286 pub variants: Vec<UnionVariant>,
287 #[serde(default, skip_serializing_if = "Option::is_none")]
288 pub discriminator: Option<Discriminator>,
289 pub kind: UnionKind,
290}
291
292#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
293pub struct UnionVariant {
294 #[serde(rename = "type")]
295 pub r#type: TypeRef,
296 #[serde(default, skip_serializing_if = "Option::is_none")]
297 pub tag: Option<String>,
298}
299
300#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
301#[serde(rename_all = "kebab-case")]
302pub enum UnionKind {
303 OneOf,
304 AnyOf,
305}
306
307#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
308pub struct Discriminator {
309 pub property_name: String,
310 pub mapping: Vec<(String, TypeRef)>,
311 #[serde(default, skip_serializing_if = "Vec::is_empty")]
315 pub extensions: Vec<(String, ValueRef)>,
316}