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}
79
80pub const NULL_ID: &str = "null";
82
83#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
86pub struct PrimitiveType {
87 pub kind: PrimitiveKind,
88 pub constraints: PrimitiveConstraints,
89}
90
91#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
101#[serde(rename_all = "kebab-case")]
102pub enum PrimitiveKind {
103 String,
105 Integer,
108 Number,
111 Bool,
113}
114
115#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
116pub struct PrimitiveConstraints {
117 #[serde(default, skip_serializing_if = "Option::is_none")]
118 pub minimum: Option<ValueRef>,
119 #[serde(default, skip_serializing_if = "Option::is_none")]
120 pub maximum: Option<ValueRef>,
121 #[serde(default, skip_serializing_if = "Option::is_none")]
122 pub exclusive_minimum: Option<ValueRef>,
123 #[serde(default, skip_serializing_if = "Option::is_none")]
124 pub exclusive_maximum: Option<ValueRef>,
125 #[serde(default, skip_serializing_if = "Option::is_none")]
126 pub multiple_of: Option<ValueRef>,
127 #[serde(default, skip_serializing_if = "Option::is_none")]
128 pub min_length: Option<u64>,
129 #[serde(default, skip_serializing_if = "Option::is_none")]
130 pub max_length: Option<u64>,
131 #[serde(default, skip_serializing_if = "Option::is_none")]
132 pub pattern: Option<String>,
133 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub format_extension: Option<String>,
135 #[serde(default, skip_serializing_if = "Option::is_none")]
140 pub content_encoding: Option<String>,
141 #[serde(default, skip_serializing_if = "Option::is_none")]
144 pub content_media_type: Option<String>,
145 #[serde(default, skip_serializing_if = "Option::is_none")]
150 pub content_schema: Option<TypeRef>,
151}
152
153#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
156pub struct ArrayType {
157 pub items: TypeRef,
158 pub constraints: ArrayConstraints,
159}
160
161#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
162pub struct ArrayConstraints {
163 #[serde(default, skip_serializing_if = "Option::is_none")]
164 pub min_items: Option<u64>,
165 #[serde(default, skip_serializing_if = "Option::is_none")]
166 pub max_items: Option<u64>,
167 #[serde(default)]
168 pub unique_items: bool,
169}
170
171#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
174pub struct ObjectType {
175 pub properties: Vec<Property>,
176 pub additional_properties: AdditionalProperties,
177 pub constraints: ObjectConstraints,
178}
179
180#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
181pub struct Property {
182 pub name: String,
183 #[serde(rename = "type")]
184 pub r#type: TypeRef,
185 #[serde(default)]
190 pub required: bool,
191 #[serde(default, skip_serializing_if = "Option::is_none")]
193 pub title: Option<String>,
194 #[serde(default, skip_serializing_if = "Option::is_none")]
196 pub description: Option<String>,
197 #[serde(default)]
199 pub deprecated: bool,
200 #[serde(default)]
201 pub read_only: bool,
202 #[serde(default)]
203 pub write_only: bool,
204 #[serde(default, skip_serializing_if = "Option::is_none")]
206 pub external_docs: Option<crate::ExternalDocs>,
207 #[serde(default, skip_serializing_if = "Option::is_none")]
210 pub default: Option<ValueRef>,
211 #[serde(default, skip_serializing_if = "Vec::is_empty")]
215 pub examples: Vec<(String, crate::Example)>,
216 #[serde(default, skip_serializing_if = "Vec::is_empty")]
220 pub extensions: Vec<(String, ValueRef)>,
221}
222
223#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
224#[serde(tag = "kind", rename_all = "kebab-case")]
225pub enum AdditionalProperties {
226 Forbidden,
227 Any,
228 Typed { r#type: TypeRef },
229}
230
231#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
232pub struct ObjectConstraints {
233 #[serde(default, skip_serializing_if = "Option::is_none")]
234 pub min_properties: Option<u64>,
235 #[serde(default, skip_serializing_if = "Option::is_none")]
236 pub max_properties: Option<u64>,
237}
238
239#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
242pub struct EnumStringType {
243 pub values: Vec<EnumStringValue>,
244}
245
246#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
250pub struct EnumStringValue {
251 pub value: String,
252}
253
254#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
255pub struct EnumIntType {
256 pub values: Vec<EnumIntValue>,
257 pub kind: IntKind,
258}
259
260#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
263pub struct EnumIntValue {
264 pub value: i64,
265}
266
267#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
268#[serde(rename_all = "kebab-case")]
269pub enum IntKind {
270 Int32,
271 Int64,
272}
273
274#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
277pub struct UnionType {
278 pub variants: Vec<UnionVariant>,
279 #[serde(default, skip_serializing_if = "Option::is_none")]
280 pub discriminator: Option<Discriminator>,
281 pub kind: UnionKind,
282}
283
284#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
285pub struct UnionVariant {
286 #[serde(rename = "type")]
287 pub r#type: TypeRef,
288 #[serde(default, skip_serializing_if = "Option::is_none")]
289 pub tag: Option<String>,
290}
291
292#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
293#[serde(rename_all = "kebab-case")]
294pub enum UnionKind {
295 OneOf,
296 AnyOf,
297}
298
299#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
300pub struct Discriminator {
301 pub property_name: String,
302 pub mapping: Vec<(String, TypeRef)>,
303 #[serde(default, skip_serializing_if = "Vec::is_empty")]
307 pub extensions: Vec<(String, ValueRef)>,
308}