pub mod dialect;
pub mod discriminator;
pub mod object;
pub mod types;
pub mod xml;
use serde::{Deserialize, Serialize};
use crate::model::schema::{
object::SchemaObject,
types::{SchemaType, TypeSet},
};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Schema {
Bool(bool),
Object(Box<SchemaObject>),
}
impl Default for Schema {
fn default() -> Self {
Self::Object(Box::default())
}
}
impl Schema {
#[must_use]
pub fn any() -> Self {
Self::Bool(true)
}
#[must_use]
pub fn never() -> Self {
Self::Bool(false)
}
#[must_use]
pub fn of_type(ty: SchemaType) -> Self {
Self::Object(Box::new(SchemaObject {
ty: Some(TypeSet::One(ty)),
..SchemaObject::default()
}))
}
#[must_use]
pub fn nullable(ty: SchemaType) -> Self {
Self::Object(Box::new(SchemaObject {
ty: Some(TypeSet::Many(vec![ty, SchemaType::Null])),
..SchemaObject::default()
}))
}
#[must_use]
pub fn reference(uri: impl Into<String>) -> Self {
Self::Object(Box::new(SchemaObject {
reference: Some(uri.into()),
..SchemaObject::default()
}))
}
#[must_use]
pub fn component(name: &str) -> Self {
Self::reference(format!("#/components/schemas/{name}"))
}
#[must_use]
pub fn as_object(&self) -> Option<&SchemaObject> {
match self {
Self::Object(object) => Some(object),
Self::Bool(_) => None,
}
}
}
#[cfg(test)]
mod tests;