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