#![cfg_attr(feature = "docs", feature(doc_cfg))]
pub mod span;
#[cfg(feature = "serde")]
#[cfg_attr(feature = "docs", doc(cfg(feature = "serde")))]
pub mod serde;
mod impls;
pub use impls::*;
pub use verify_macros::Verify;
pub trait Error: Sized + std::error::Error + core::ops::AddAssign {
fn custom<T: core::fmt::Display>(error: T) -> Self;
}
pub trait ErrorExt: Sized {
fn combine(&mut self, span: Self);
}
impl<T: Error> ErrorExt for T {
fn combine(&mut self, span: Self) {
*self += span;
}
}
impl<T: Error> ErrorExt for Option<T> {
fn combine(&mut self, span: Self) {
match span {
Some(new_span) => match self {
Some(s) => *s += new_span,
None => *self = Some(new_span),
},
None => {
*self = None;
}
}
}
}
pub trait Validate: span::Spanned {
fn validate<V: Validator<Self::Span>>(&self, validator: V) -> Result<(), V::Error>;
}
pub trait Verifier<S: span::Span> {
type Error: Error;
fn verify_value<V: ?Sized + Validate<Span = S>>(&self, value: &V) -> Result<(), Self::Error>;
fn verify_value_with_span<V: ?Sized + Validate<Span = S>>(
&self,
value: &V,
_span: Option<V::Span>,
) -> Result<(), Self::Error> {
self.verify_value(value)
}
}
pub trait Verify {
type Error: Error;
fn verify(&self) -> Result<(), Self::Error>;
}
pub trait Validator<S: span::Span>: Sized {
type Error: Error;
type ValidateSeq: ValidateSeq<S, Error = Self::Error>;
type ValidateMap: ValidateMap<S, Error = Self::Error>;
fn with_span(self, span: Option<S>) -> Self;
fn validate_bool(self, v: bool) -> Result<(), Self::Error>;
fn validate_i8(self, v: i8) -> Result<(), Self::Error>;
fn validate_i16(self, v: i16) -> Result<(), Self::Error>;
fn validate_i32(self, v: i32) -> Result<(), Self::Error>;
fn validate_i64(self, v: i64) -> Result<(), Self::Error>;
fn validate_i128(self, v: i128) -> Result<(), Self::Error>;
fn validate_u8(self, v: u8) -> Result<(), Self::Error>;
fn validate_u16(self, v: u16) -> Result<(), Self::Error>;
fn validate_u32(self, v: u32) -> Result<(), Self::Error>;
fn validate_u64(self, v: u64) -> Result<(), Self::Error>;
fn validate_u128(self, v: u128) -> Result<(), Self::Error>;
fn validate_f32(self, v: f32) -> Result<(), Self::Error>;
fn validate_f64(self, v: f64) -> Result<(), Self::Error>;
fn validate_char(self, v: char) -> Result<(), Self::Error>;
fn validate_str(self, v: &str) -> Result<(), Self::Error>;
fn validate_bytes(self, v: &[u8]) -> Result<(), Self::Error>;
fn validate_none(self) -> Result<(), Self::Error>;
fn validate_some<V>(self, value: &V) -> Result<(), Self::Error>
where
V: ?Sized + Validate<Span = S>;
fn validate_unit(self) -> Result<(), Self::Error>;
fn validate_unit_struct(self, name: &'static str) -> Result<(), Self::Error>;
fn validate_unit_variant(
self,
name: &'static str,
variant_index: u32,
variant: &'static str,
) -> Result<(), Self::Error>;
fn validate_seq(self, len: Option<usize>) -> Result<Self::ValidateSeq, Self::Error>;
fn validate_map(self, len: Option<usize>) -> Result<Self::ValidateMap, Self::Error>;
fn validate_tag<V>(&mut self, tag: &V) -> Result<(), Self::Error>
where
V: ?Sized + Validate<Span = S> + ToString;
}
pub trait ValidateSeq<S: span::Span> {
type Error: std::error::Error;
fn with_span(&mut self, span: Option<S>) -> &mut Self;
fn validate_element<V>(&mut self, value: &V) -> Result<(), Self::Error>
where
V: ?Sized + Validate<Span = S> + core::hash::Hash;
fn end(self) -> Result<(), Self::Error>;
}
pub trait ValidateMap<S: span::Span> {
type Error: std::error::Error;
fn with_span(&mut self, span: Option<S>) -> &mut Self;
fn validate_key<V>(&mut self, key: &V) -> Result<(), Self::Error>
where
V: ?Sized + Validate<Span = S>;
fn validate_string_key<V>(&mut self, key: &V) -> Result<(), Self::Error>
where
V: ?Sized + Validate<Span = S> + ToString;
fn validate_value<V: ?Sized>(&mut self, value: &V) -> Result<(), Self::Error>
where
V: Validate<Span = S>;
fn validate_entry<K: ?Sized, V: ?Sized>(
&mut self,
key: &K,
value: &V,
) -> Result<(), Self::Error>
where
K: Validate<Span = S>,
V: Validate<Span = S>,
{
self.validate_key(key)?;
self.validate_value(value)
}
fn validate_string_entry<K, V>(&mut self, key: &K, value: &V) -> Result<(), Self::Error>
where
K: ?Sized + Validate<Span = S> + ToString,
V: ?Sized + Validate<Span = S>,
{
self.validate_string_key(key)?;
self.validate_value(value)
}
fn string_key_required(&self) -> bool {
false
}
fn end(self) -> Result<(), Self::Error>;
}