serde_valid/validation/error/
array_erros.rs

1use serde::ser::SerializeStruct;
2
3use super::{ItemErrorsMap, VecErrors};
4
5#[derive(Debug, Clone, thiserror::Error)]
6pub struct ArrayErrors<E = crate::validation::Error> {
7    pub errors: VecErrors<E>,
8    pub items: ItemErrorsMap<E>,
9}
10
11impl<E> serde::Serialize for ArrayErrors<E>
12where
13    E: serde::Serialize,
14{
15    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: serde::Serializer,
18    {
19        let mut array_errors = serializer.serialize_struct("ArrayErrors", 2)?;
20        array_errors.serialize_field("errors", &self.errors)?;
21        array_errors.serialize_field("items", &self.items)?;
22        array_errors.end()
23    }
24}
25
26impl<E> ArrayErrors<E> {
27    pub fn new(errors: VecErrors<E>, items: ItemErrorsMap<E>) -> Self {
28        Self { errors, items }
29    }
30}
31
32impl<E> ArrayErrors<E>
33where
34    E: Clone,
35{
36    pub fn merge(mut self, other: ArrayErrors<E>) -> Self {
37        self.errors.extend(other.errors);
38
39        for (index, item) in other.items {
40            match self.items.get_mut(&index) {
41                Some(errors) => errors.merge(item),
42                None => {
43                    self.items.insert(index, item);
44                }
45            };
46        }
47        self
48    }
49}
50
51impl<E> std::fmt::Display for ArrayErrors<E>
52where
53    E: serde::Serialize,
54{
55    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
56        match serde_json::to_string(&self) {
57            Ok(json_string) => {
58                write!(f, "{}", json_string)
59            }
60            Err(_) => Err(std::fmt::Error),
61        }
62    }
63}