validator_async/
display_impl.rs1use std::fmt::{self, Write};
2
3use crate::{ValidationError, ValidationErrors, ValidationErrorsKind};
4
5impl fmt::Display for ValidationError {
6 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
7 if let Some(msg) = self.message.as_ref() {
8 write!(fmt, "{}", msg)
9 } else {
10 write!(fmt, "Validation error: {} [{:?}]", self.code, self.params)
11 }
12 }
13}
14
15fn display_errors(
16 fmt: &mut fmt::Formatter<'_>,
17 errs: &ValidationErrorsKind,
18 path: &str,
19) -> fmt::Result {
20 fn display_struct(
21 fmt: &mut fmt::Formatter<'_>,
22 errs: &ValidationErrors,
23 path: &str,
24 ) -> fmt::Result {
25 let mut full_path = String::new();
26 write!(&mut full_path, "{}.", path)?;
27 let base_len = full_path.len();
28 for (path, err) in errs.errors() {
29 write!(&mut full_path, "{}", path)?;
30 display_errors(fmt, err, &full_path)?;
31 full_path.truncate(base_len);
32 }
33 Ok(())
34 }
35
36 match errs {
37 ValidationErrorsKind::Field(errs) => {
38 write!(fmt, "{}: ", path)?;
39 let len = errs.len();
40 for (idx, err) in errs.iter().enumerate() {
41 if idx + 1 == len {
42 write!(fmt, "{}", err)?;
43 } else {
44 write!(fmt, "{}, ", err)?;
45 }
46 }
47 Ok(())
48 }
49 ValidationErrorsKind::Struct(errs) => display_struct(fmt, errs, path),
50 ValidationErrorsKind::List(errs) => {
51 let mut full_path = String::new();
52 write!(&mut full_path, "{}", path)?;
53 let base_len = full_path.len();
54 for (idx, err) in errs.iter() {
55 write!(&mut full_path, "[{}]", idx)?;
56 display_struct(fmt, err, &full_path)?;
57 full_path.truncate(base_len);
58 }
59 Ok(())
60 }
61 }
62}
63
64impl fmt::Display for ValidationErrors {
65 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
66 for (idx, (path, err)) in self.errors().iter().enumerate() {
67 display_errors(fmt, err, path)?;
68 if idx + 1 < self.errors().len() {
69 writeln!(fmt)?;
70 }
71 }
72 Ok(())
73 }
74}