serde_valid/validation/error/
errors.rs

1use super::{ArrayErrors, ObjectErrors, VecErrors};
2
3#[derive(Debug, Clone, thiserror::Error)]
4pub enum Errors<E = crate::validation::Error> {
5    Array(ArrayErrors<E>),
6    Object(ObjectErrors<E>),
7    NewType(VecErrors<E>),
8}
9
10impl<E> serde::Serialize for Errors<E>
11where
12    E: serde::Serialize,
13{
14    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
15    where
16        S: serde::Serializer,
17    {
18        match self {
19            Self::Array(a) => serde::Serialize::serialize(a, serializer),
20            Self::Object(o) => serde::Serialize::serialize(o, serializer),
21            Self::NewType(n) => {
22                #[derive(Debug, Clone, serde::Serialize)]
23                struct NewTypeErrors<'a, E> {
24                    errors: &'a VecErrors<E>,
25                }
26
27                serde::Serialize::serialize(&NewTypeErrors { errors: n }, serializer)
28            }
29        }
30    }
31}
32
33impl<E> Errors<E>
34where
35    E: Clone,
36{
37    pub fn merge(&mut self, other: Errors<E>) {
38        match self {
39            Errors::Array(a) => match other {
40                Errors::Array(b) => {
41                    a.errors.extend(b.errors);
42
43                    for (index, item) in b.items {
44                        match a.items.get_mut(&index) {
45                            Some(errors) => errors.merge(item),
46                            None => {
47                                a.items.insert(index, item);
48                            }
49                        };
50                    }
51                }
52                Errors::Object(_) => {
53                    unreachable!("conflict Array and Object in serde_valid::validation::Errors")
54                }
55                Errors::NewType(errors) => {
56                    a.errors.extend(errors);
57                }
58            },
59            Errors::NewType(a) => match other {
60                Errors::Array(b) => {
61                    a.extend(b.errors);
62                    *self = Errors::Array(ArrayErrors::new(a.to_vec(), b.items));
63                }
64                Errors::Object(_) => {
65                    unreachable!("conflict Array and Object in serde_valid::validation::Errors")
66                }
67                Errors::NewType(b) => {
68                    a.extend(b);
69                }
70            },
71            Errors::Object(_) => {
72                unimplemented!("Object does not support yet.")
73            }
74        }
75    }
76}
77
78impl<E> std::fmt::Display for Errors<E>
79where
80    E: serde::Serialize + std::fmt::Display,
81{
82    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
83        match self {
84            Self::Array(errors) => std::fmt::Display::fmt(errors, f),
85            Self::Object(errors) => std::fmt::Display::fmt(errors, f),
86            Self::NewType(vec_errors) => {
87                let errors = &vec_errors
88                    .iter()
89                    .map(ToString::to_string)
90                    .collect::<Vec<String>>();
91                let value = serde_json::json!({ "errors": errors });
92                std::fmt::Display::fmt(&value, f)
93            }
94        }
95    }
96}