use std::collections::HashMap;
#[cfg(feature = "core")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "proc")]
use procmeta::prelude::*;
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub enum Value {
Null,
Bool(bool),
Number(Number),
String(String),
Array(Vec<Value>),
Object(HashMap<String, Value>),
}
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub enum Number {
PosInt(u64),
NegInt(i64),
Float(f64),
}
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub enum ConstraintType {
None,
Description(String),
SelfValidator,
Regex(String),
Value(Value),
Range(Number, Number),
Length(usize, usize),
Anyone(Vec<ConstraintType>),
Enumer(String),
}
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub struct LengthError {
pub min: usize,
pub max: usize,
pub len: usize,
}
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub struct RangeError {
pub min: String,
pub max: String,
pub value: String,
}
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub struct RegexError {
pub regex: String,
pub value: String,
}
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub struct EnumError;
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub enum ErrorType {
Regex(RegexError),
Length(LengthError),
Range(RangeError),
Model(ModelValidatorError),
Enumer(EnumError),
Value,
Other,
}
#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone))]
#[cfg_attr(feature = "proc", derive(GetTokenStream))]
pub struct ModelValidatorError {
pub error_ty: Box<ErrorType>,
pub error_message: Option<String>,
pub field_id: Option<String>,
pub field_name: Option<String>,
}
impl From<LengthError> for ErrorType {
fn from(value: LengthError) -> Self {
Self::Length(value)
}
}
impl From<RangeError> for ErrorType {
fn from(value: RangeError) -> Self {
Self::Range(value)
}
}
impl From<ModelValidatorError> for ErrorType {
fn from(value: ModelValidatorError) -> Self {
Self::Model(value)
}
}
impl From<RegexError> for ErrorType {
fn from(value: RegexError) -> Self {
Self::Regex(value)
}
}
impl From<EnumError> for ErrorType {
fn from(value: EnumError) -> Self {
Self::Enumer(value)
}
}