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 #[serde(default, skip_serializing_if = "Vec::is_empty")]
191 pub pattern_properties: Vec<PatternProperty>,
192 pub additional_properties: AdditionalProperties,
193 #[serde(default, skip_serializing_if = "Option::is_none")]
199 pub property_names: Option<TypeRef>,
200 pub constraints: ObjectConstraints,
201}
202
203#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
206pub struct PatternProperty {
207 pub pattern: String,
211 #[serde(rename = "type")]
213 pub r#type: TypeRef,
214}
215
216#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
217pub struct Property {
218 pub name: String,
219 #[serde(rename = "type")]
220 pub r#type: TypeRef,
221 #[serde(default)]
226 pub required: bool,
227 #[serde(default, skip_serializing_if = "Option::is_none")]
229 pub title: Option<String>,
230 #[serde(default, skip_serializing_if = "Option::is_none")]
232 pub description: Option<String>,
233 #[serde(default)]
235 pub deprecated: bool,
236 #[serde(default)]
237 pub read_only: bool,
238 #[serde(default)]
239 pub write_only: bool,
240 #[serde(default, skip_serializing_if = "Option::is_none")]
242 pub external_docs: Option<crate::ExternalDocs>,
243 #[serde(default, skip_serializing_if = "Option::is_none")]
246 pub default: Option<ValueRef>,
247 #[serde(default, skip_serializing_if = "Vec::is_empty")]
251 pub examples: Vec<(String, crate::Example)>,
252 #[serde(default, skip_serializing_if = "Vec::is_empty")]
256 pub extensions: Vec<(String, ValueRef)>,
257}
258
259#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
260#[serde(tag = "kind", rename_all = "kebab-case")]
261pub enum AdditionalProperties {
262 Forbidden,
263 Any,
264 Typed { r#type: TypeRef },
265}
266
267#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
268pub struct ObjectConstraints {
269 #[serde(default, skip_serializing_if = "Option::is_none")]
270 pub min_properties: Option<u64>,
271 #[serde(default, skip_serializing_if = "Option::is_none")]
272 pub max_properties: Option<u64>,
273}
274
275#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
278pub struct EnumStringType {
279 pub values: Vec<EnumStringValue>,
280}
281
282#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
286pub struct EnumStringValue {
287 pub value: String,
288}
289
290#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
291pub struct EnumIntType {
292 pub values: Vec<EnumIntValue>,
293 pub kind: IntKind,
294}
295
296#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
299pub struct EnumIntValue {
300 pub value: i64,
301}
302
303#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
304#[serde(rename_all = "kebab-case")]
305pub enum IntKind {
306 Int32,
307 Int64,
308}
309
310#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
313pub struct UnionType {
314 pub variants: Vec<UnionVariant>,
315 #[serde(default, skip_serializing_if = "Option::is_none")]
316 pub discriminator: Option<Discriminator>,
317 pub kind: UnionKind,
318}
319
320#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
321pub struct UnionVariant {
322 #[serde(rename = "type")]
323 pub r#type: TypeRef,
324 #[serde(default, skip_serializing_if = "Option::is_none")]
325 pub tag: Option<String>,
326}
327
328#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
329#[serde(rename_all = "kebab-case")]
330pub enum UnionKind {
331 OneOf,
332 AnyOf,
333}
334
335#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
336pub struct Discriminator {
337 pub property_name: String,
338 pub mapping: Vec<(String, TypeRef)>,
339 #[serde(default, skip_serializing_if = "Vec::is_empty")]
343 pub extensions: Vec<(String, ValueRef)>,
344}