roadblk_attr/
lib.rs

1use std::collections::HashMap;
2
3#[cfg(feature = "core")]
4use serde::{Deserialize, Serialize};
5
6#[cfg(feature = "proc")]
7use procmeta::prelude::*;
8
9#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
10#[cfg_attr(feature = "proc", derive(GetTokenStream))]
11pub enum Value {
12    Null,
13
14    Bool(bool),
15
16    Number(Number),
17
18    String(String),
19
20    Array(Vec<Value>),
21
22    Object(HashMap<String, Value>),
23}
24
25#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
26#[cfg_attr(feature = "proc", derive(GetTokenStream))]
27pub enum Number {
28    PosInt(u64),
29    NegInt(i64),
30    Float(f64),
31}
32
33#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
34#[cfg_attr(feature = "proc", derive(GetTokenStream))]
35pub enum ConstraintType {
36    // 无
37    None,
38
39    // 描述
40    Description(String),
41
42    // 校验器
43    SelfValidator,
44
45    // 正则表达式
46    Regex(String),
47
48    // 值
49    Value(Value),
50
51    // 数值范围
52    Range(Number, Number),
53
54    // 长度
55    Length(usize, usize),
56
57    // 其中一个
58    Anyone(Vec<ConstraintType>),
59
60    // 枚举: 模型信息
61    Enumer(String),
62}
63
64#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
65#[cfg_attr(feature = "proc", derive(GetTokenStream))]
66pub struct LengthError {
67    pub min: usize,
68    pub max: usize,
69    pub len: usize,
70}
71
72#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
73#[cfg_attr(feature = "proc", derive(GetTokenStream))]
74pub struct RangeError {
75    pub min: String,
76    pub max: String,
77    pub value: String,
78}
79
80#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
81#[cfg_attr(feature = "proc", derive(GetTokenStream))]
82pub struct RegexError {
83    pub regex: String,
84    pub value: String,
85}
86
87#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
88#[cfg_attr(feature = "proc", derive(GetTokenStream))]
89pub struct EnumError;
90
91#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
92#[cfg_attr(feature = "proc", derive(GetTokenStream))]
93pub enum ErrorType {
94    Regex(RegexError),
95
96    Length(LengthError),
97
98    Range(RangeError),
99
100    Model(ModelValidatorError),
101
102    Enumer(EnumError),
103
104    Value,
105
106    Other,
107}
108
109#[cfg_attr(feature = "core", derive(Debug, Serialize, Deserialize, Clone, PartialEq))]
110#[cfg_attr(feature = "proc", derive(GetTokenStream))]
111pub struct ModelValidatorError {
112    pub error_ty: Box<ErrorType>,
113    pub error_message: Option<String>,
114    pub field_ident: Option<String>,
115    pub field_name: Option<String>,
116}
117
118impl From<LengthError> for ErrorType {
119    fn from(value: LengthError) -> Self {
120        Self::Length(value)
121    }
122}
123
124impl From<RangeError> for ErrorType {
125    fn from(value: RangeError) -> Self {
126        Self::Range(value)
127    }
128}
129
130impl From<ModelValidatorError> for ErrorType {
131    fn from(value: ModelValidatorError) -> Self {
132        Self::Model(value)
133    }
134}
135
136impl From<RegexError> for ErrorType {
137    fn from(value: RegexError) -> Self {
138        Self::Regex(value)
139    }
140}
141
142impl From<EnumError> for ErrorType {
143    fn from(value: EnumError) -> Self {
144        Self::Enumer(value)
145    }
146}