176 lines
5.8 KiB
Rust
176 lines
5.8 KiB
Rust
use crate as schemars;
|
|
use crate::{JsonSchema, Map, Set};
|
|
use serde::{Deserialize, Serialize};
|
|
use serde_json::Value;
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema)]
|
|
#[serde(untagged)]
|
|
pub enum Schema {
|
|
Bool(bool),
|
|
Ref(Ref),
|
|
Object(SchemaObject),
|
|
}
|
|
|
|
impl From<SchemaObject> for Schema {
|
|
fn from(o: SchemaObject) -> Self {
|
|
Schema::Object(o)
|
|
}
|
|
}
|
|
|
|
impl From<bool> for Schema {
|
|
fn from(b: bool) -> Self {
|
|
Schema::Bool(b)
|
|
}
|
|
}
|
|
|
|
impl From<Ref> for Schema {
|
|
fn from(r: Ref) -> Self {
|
|
Schema::Ref(r)
|
|
}
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema)]
|
|
pub struct Ref {
|
|
#[serde(rename = "$ref")]
|
|
pub reference: String,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema)]
|
|
#[serde(rename_all = "camelCase", default)]
|
|
pub struct SchemaObject {
|
|
#[serde(rename = "$schema", skip_serializing_if = "Option::is_none")]
|
|
pub schema: Option<String>,
|
|
#[serde(rename = "$id", skip_serializing_if = "Option::is_none")]
|
|
pub id: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub title: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub description: Option<String>,
|
|
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
|
|
// TODO Set instead of Vec
|
|
pub instance_type: Option<SingleOrVec<InstanceType>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub format: Option<String>,
|
|
#[serde(rename = "enum", skip_serializing_if = "Option::is_none")]
|
|
// TODO Set instead of Vec
|
|
pub enum_values: Option<Vec<Value>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub all_of: Option<Vec<Schema>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub any_of: Option<Vec<Schema>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub one_of: Option<Vec<Schema>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub not: Option<Box<Schema>>,
|
|
#[serde(rename = "if", skip_serializing_if = "Option::is_none")]
|
|
pub if_schema: Option<Box<Schema>>,
|
|
#[serde(rename = "then", skip_serializing_if = "Option::is_none")]
|
|
pub then_schema: Option<Box<Schema>>,
|
|
#[serde(rename = "else", skip_serializing_if = "Option::is_none")]
|
|
pub else_schema: Option<Box<Schema>>,
|
|
#[serde(skip_serializing_if = "Map::is_empty")]
|
|
pub definitions: Map<String, Schema>,
|
|
#[serde(flatten)]
|
|
pub number: NumberValidation,
|
|
#[serde(flatten)]
|
|
pub string: StringValidation,
|
|
#[serde(flatten)]
|
|
pub array: ArrayValidation,
|
|
#[serde(flatten)]
|
|
pub object: ObjectValidation,
|
|
#[serde(flatten)]
|
|
pub extensions: Map<String, Value>,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema)]
|
|
#[serde(rename_all = "camelCase", default)]
|
|
pub struct NumberValidation {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub multiple_of: Option<f64>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub maximum: Option<f64>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub exclusive_maximum: Option<f64>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub minimum: Option<f64>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub exclusive_minimum: Option<f64>,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema)]
|
|
#[serde(rename_all = "camelCase", default)]
|
|
pub struct StringValidation {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub max_length: Option<u32>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub min_length: Option<u32>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub pattern: Option<String>,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema)]
|
|
#[serde(rename_all = "camelCase", default)]
|
|
pub struct ArrayValidation {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub items: Option<SingleOrVec<Schema>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub additional_items: Option<Box<Schema>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub max_items: Option<u32>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub min_items: Option<u32>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub unique_items: Option<bool>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub contains: Option<Box<Schema>>,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default, JsonSchema)]
|
|
#[serde(rename_all = "camelCase", default)]
|
|
pub struct ObjectValidation {
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub max_properties: Option<u32>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub min_properties: Option<u32>,
|
|
#[serde(skip_serializing_if = "Set::is_empty")]
|
|
pub required: Set<String>,
|
|
#[serde(skip_serializing_if = "Map::is_empty")]
|
|
pub properties: Map<String, Schema>,
|
|
#[serde(skip_serializing_if = "Map::is_empty")]
|
|
pub pattern_properties: Map<String, Schema>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub additional_properties: Option<Box<Schema>>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub property_names: Option<Box<Schema>>,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, JsonSchema)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub enum InstanceType {
|
|
Null,
|
|
Boolean,
|
|
Object,
|
|
Array,
|
|
Number,
|
|
String,
|
|
Integer,
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, JsonSchema)]
|
|
#[serde(untagged)]
|
|
pub enum SingleOrVec<T> {
|
|
Single(Box<T>),
|
|
Vec(Vec<T>),
|
|
}
|
|
|
|
impl<T> From<T> for SingleOrVec<T> {
|
|
fn from(single: T) -> Self {
|
|
SingleOrVec::Single(Box::new(single))
|
|
}
|
|
}
|
|
|
|
impl<T> From<Vec<T>> for SingleOrVec<T> {
|
|
fn from(vec: Vec<T>) -> Self {
|
|
SingleOrVec::Vec(vec)
|
|
}
|
|
}
|