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