serde_valid/validation/error/
errors.rs1use 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}