mod external;
mod impls;
mod iterator;
mod macros;
mod nullable;
use std::borrow::Cow;
use serde::{Deserializer, Serializer};
use crate::{
Registry,
openapi::{MaybeRef, Schema},
};
pub use self::{iterator::*, nullable::*};
pub use autapi_macros::ToSchema;
pub trait ToSchema {
type Original: ToSchema;
const REQUIRED: bool;
const ALWAYS_INLINED: bool;
fn name() -> Cow<'static, str>;
fn schema(registry: &mut Registry) -> MaybeRef<Schema>;
fn schema_ref(registry: &mut Registry) -> MaybeRef<Schema> {
if Self::ALWAYS_INLINED {
Self::schema(registry)
} else {
MaybeRef::Ref(registry.register_schema::<Self>())
}
}
}
pub trait SchemaSerialize: ToSchema {
fn schema_serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer;
fn is_present(&self) -> bool;
}
pub trait SchemaDeserialize: Sized + ToSchema {
fn schema_deserialize<'de, D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>;
fn deserialize_missing() -> Option<Self>;
}
pub trait SchemaUsing<T: ToSchema> {
type Ser<'a>: ToSchema<Original = T::Original>
where
Self: 'a,
T: 'a;
fn to_ser<'a>(&'a self) -> Self::Ser<'a>;
fn from_de(de: T) -> Self;
}