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 EnumBool(EnumBoolType),
76 EnumNumber(EnumNumberType),
80 Union(UnionType),
81 Null,
86 Any,
94}
95
96pub const NULL_ID: &str = "null";
98
99#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
102pub struct PrimitiveType {
103 pub kind: PrimitiveKind,
104 pub constraints: PrimitiveConstraints,
105}
106
107#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
117#[serde(rename_all = "kebab-case")]
118pub enum PrimitiveKind {
119 String,
121 Integer,
124 Number,
127 Bool,
129}
130
131#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
132pub struct PrimitiveConstraints {
133 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub minimum: Option<ValueRef>,
135 #[serde(default, skip_serializing_if = "Option::is_none")]
136 pub maximum: Option<ValueRef>,
137 #[serde(default, skip_serializing_if = "Option::is_none")]
138 pub exclusive_minimum: Option<ValueRef>,
139 #[serde(default, skip_serializing_if = "Option::is_none")]
140 pub exclusive_maximum: Option<ValueRef>,
141 #[serde(default, skip_serializing_if = "Option::is_none")]
142 pub multiple_of: Option<ValueRef>,
143 #[serde(default, skip_serializing_if = "Option::is_none")]
144 pub min_length: Option<u64>,
145 #[serde(default, skip_serializing_if = "Option::is_none")]
146 pub max_length: Option<u64>,
147 #[serde(default, skip_serializing_if = "Option::is_none")]
148 pub pattern: Option<String>,
149 #[serde(default, skip_serializing_if = "Option::is_none")]
150 pub format_extension: Option<String>,
151 #[serde(default, skip_serializing_if = "Option::is_none")]
156 pub content_encoding: Option<String>,
157 #[serde(default, skip_serializing_if = "Option::is_none")]
160 pub content_media_type: Option<String>,
161 #[serde(default, skip_serializing_if = "Option::is_none")]
166 pub content_schema: Option<TypeRef>,
167}
168
169#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
172pub struct ArrayType {
173 pub items: TypeRef,
174 pub constraints: ArrayConstraints,
175}
176
177#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
178pub struct ArrayConstraints {
179 #[serde(default, skip_serializing_if = "Option::is_none")]
180 pub min_items: Option<u64>,
181 #[serde(default, skip_serializing_if = "Option::is_none")]
182 pub max_items: Option<u64>,
183 #[serde(default)]
184 pub unique_items: bool,
185}
186
187#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
190pub struct ObjectType {
191 pub properties: Vec<Property>,
192 #[serde(default, skip_serializing_if = "Vec::is_empty")]
199 pub pattern_properties: Vec<PatternProperty>,
200 pub additional_properties: AdditionalProperties,
201 #[serde(default, skip_serializing_if = "Option::is_none")]
207 pub property_names: Option<TypeRef>,
208 pub constraints: ObjectConstraints,
209}
210
211#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
214pub struct PatternProperty {
215 pub pattern: String,
219 #[serde(rename = "type")]
221 pub r#type: TypeRef,
222}
223
224#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
225pub struct Property {
226 pub name: String,
227 #[serde(rename = "type")]
228 pub r#type: TypeRef,
229 #[serde(default)]
234 pub required: bool,
235 #[serde(default, skip_serializing_if = "Option::is_none")]
237 pub title: Option<String>,
238 #[serde(default, skip_serializing_if = "Option::is_none")]
240 pub description: Option<String>,
241 #[serde(default)]
243 pub deprecated: bool,
244 #[serde(default)]
245 pub read_only: bool,
246 #[serde(default)]
247 pub write_only: bool,
248 #[serde(default, skip_serializing_if = "Option::is_none")]
250 pub external_docs: Option<crate::ExternalDocs>,
251 #[serde(default, skip_serializing_if = "Option::is_none")]
254 pub default: Option<ValueRef>,
255 #[serde(default, skip_serializing_if = "Vec::is_empty")]
259 pub examples: Vec<(String, crate::Example)>,
260 #[serde(default, skip_serializing_if = "Vec::is_empty")]
264 pub extensions: Vec<(String, ValueRef)>,
265}
266
267#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
268#[serde(tag = "kind", rename_all = "kebab-case")]
269pub enum AdditionalProperties {
270 Forbidden,
271 Any,
272 Typed { r#type: TypeRef },
273}
274
275#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
276pub struct ObjectConstraints {
277 #[serde(default, skip_serializing_if = "Option::is_none")]
278 pub min_properties: Option<u64>,
279 #[serde(default, skip_serializing_if = "Option::is_none")]
280 pub max_properties: Option<u64>,
281}
282
283#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
286pub struct EnumStringType {
287 pub values: Vec<EnumStringValue>,
288}
289
290#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
294pub struct EnumStringValue {
295 pub value: String,
296}
297
298#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
299pub struct EnumIntType {
300 pub values: Vec<EnumIntValue>,
301 pub kind: IntKind,
302}
303
304#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
307pub struct EnumIntValue {
308 pub value: i64,
309}
310
311#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
312#[serde(rename_all = "kebab-case")]
313pub enum IntKind {
314 Int32,
315 Int64,
316}
317
318#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
319pub struct EnumBoolType {
320 pub values: Vec<EnumBoolValue>,
321}
322
323#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
326pub struct EnumBoolValue {
327 pub value: bool,
328}
329
330#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
331pub struct EnumNumberType {
332 pub values: Vec<EnumNumberValue>,
333 pub kind: NumberKind,
334}
335
336#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
339pub struct EnumNumberValue {
340 pub value: f64,
341}
342
343#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
347#[serde(rename_all = "kebab-case")]
348pub enum NumberKind {
349 Float,
350 Double,
351}
352
353#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
356pub struct UnionType {
357 pub variants: Vec<UnionVariant>,
358 #[serde(default, skip_serializing_if = "Option::is_none")]
359 pub discriminator: Option<Discriminator>,
360 pub kind: UnionKind,
361}
362
363#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
364pub struct UnionVariant {
365 #[serde(rename = "type")]
366 pub r#type: TypeRef,
367 #[serde(default, skip_serializing_if = "Option::is_none")]
368 pub tag: Option<String>,
369}
370
371#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
372#[serde(rename_all = "kebab-case")]
373pub enum UnionKind {
374 OneOf,
375 AnyOf,
376}
377
378#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
379pub struct Discriminator {
380 pub property_name: String,
381 pub mapping: Vec<(String, TypeRef)>,
382 #[serde(default, skip_serializing_if = "Vec::is_empty")]
386 pub extensions: Vec<(String, ValueRef)>,
387}