1use axum::Json;
2use serde_json::Value;
3use std::fmt;
4
5pub type ValidResult = Result<(), ValidError>;
6
7pub trait Rule<T> {
8 fn valid(&self, value: T, field_path: &str, message: Option<String>) -> ValidResult;
9 fn example(&self) -> Vec<Value>;
10}
11
12#[derive(thiserror::Error, Debug)]
13pub struct ValidError {
14 pub message: String,
15}
16
17impl fmt::Display for ValidError {
18 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19 write!(f, "{}", self.message)
20 }
21}
22
23pub trait Validator {
24 fn valid(&self) -> ValidResult;
25 fn example(&self) -> Vec<Value>;
26}
27
28impl<T: Validator> Validator for Json<T> {
29 fn valid(&self) -> ValidResult {
30 self.0.valid()
31 }
32
33 fn example(&self) -> Vec<Value> {
34 self.0.example()
35 }
36}
37
38impl Validator for axum::body::Body {
39 fn valid(&self) -> ValidResult {
40 Ok(())
41 }
42
43 fn example(&self) -> Vec<Value> {
44 vec![]
45 }
46}