use serde::{Deserialize, Serialize};
use crate::diagnostic::SpecLocation;
use crate::value::ValueRef;
pub type TypeRef = String;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct NamedType {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub original_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(default, skip_serializing_if = "is_false")]
pub read_only: bool,
#[serde(default, skip_serializing_if = "is_false")]
pub write_only: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub external_docs: Option<crate::ExternalDocs>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default: Option<ValueRef>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub examples: Vec<(String, crate::Example)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub xml: Option<crate::XmlObject>,
pub definition: TypeDef,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub location: Option<SpecLocation>,
}
fn is_false(b: &bool) -> bool {
!*b
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "def", rename_all = "kebab-case")]
pub enum TypeDef {
Primitive(PrimitiveType),
Object(ObjectType),
Array(ArrayType),
EnumString(EnumStringType),
EnumInt(EnumIntType),
Union(UnionType),
Null,
}
pub const NULL_ID: &str = "null";
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PrimitiveType {
pub kind: PrimitiveKind,
pub constraints: PrimitiveConstraints,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum PrimitiveKind {
String,
Integer,
Number,
Bool,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct PrimitiveConstraints {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub minimum: Option<ValueRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub maximum: Option<ValueRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exclusive_minimum: Option<ValueRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub exclusive_maximum: Option<ValueRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub multiple_of: Option<ValueRef>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_length: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_length: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pattern: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format_extension: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_encoding: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_media_type: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_schema: Option<TypeRef>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ArrayType {
pub items: TypeRef,
pub constraints: ArrayConstraints,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct ArrayConstraints {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_items: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_items: Option<u64>,
#[serde(default)]
pub unique_items: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ObjectType {
pub properties: Vec<Property>,
pub additional_properties: AdditionalProperties,
pub constraints: ObjectConstraints,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Property {
pub name: String,
#[serde(rename = "type")]
pub r#type: TypeRef,
#[serde(default)]
pub required: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
#[serde(default)]
pub deprecated: bool,
#[serde(default)]
pub read_only: bool,
#[serde(default)]
pub write_only: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default: Option<ValueRef>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "kebab-case")]
pub enum AdditionalProperties {
Forbidden,
Any,
Typed { r#type: TypeRef },
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
pub struct ObjectConstraints {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_properties: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub max_properties: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumStringType {
pub values: Vec<EnumStringValue>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumStringValue {
pub value: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumIntType {
pub values: Vec<EnumIntValue>,
pub kind: IntKind,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EnumIntValue {
pub value: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub documentation: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum IntKind {
Int32,
Int64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnionType {
pub variants: Vec<UnionVariant>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub discriminator: Option<Discriminator>,
pub kind: UnionKind,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct UnionVariant {
#[serde(rename = "type")]
pub r#type: TypeRef,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tag: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum UnionKind {
OneOf,
AnyOf,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Discriminator {
pub property_name: String,
pub mapping: Vec<(String, TypeRef)>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub extensions: Vec<(String, ValueRef)>,
}