1use std::fmt;
2
3#[derive(Debug)]
4pub struct ValidationError {
5 pub pointer: ValidationPointer,
6 pub message: String,
7}
8
9impl ValidationError {
10 pub fn new(pointer: ValidationPointer, message: String) -> ValidationError {
11 ValidationError { pointer, message }
12 }
13}
14
15impl fmt::Display for ValidationError {
16 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17 write!(f, "{}: {}", self.pointer, self.message)
18 }
19}
20
21impl std::error::Error for ValidationError {}
22
23#[derive(Debug)]
24pub enum ValidationPointer {
25 Field {
26 type_name: String,
27 name: String,
28 },
29 Variant {
30 type_name: String,
31 name: String,
32 },
33 VariantField {
34 type_name: String,
35 variant_name: String,
36 name: String,
37 },
38 Type(String),
39 Function(String),
40}
41
42impl fmt::Display for ValidationPointer {
43 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44 match self {
45 ValidationPointer::Field { type_name, name } => write!(f, "{type_name}.{name}"),
46 ValidationPointer::Variant { type_name, name } => write!(f, "{type_name}::{name}"),
47 ValidationPointer::VariantField {
48 type_name,
49 variant_name,
50 name,
51 } => write!(f, "{type_name}.{variant_name}.{name}"),
52 ValidationPointer::Type(name) => write!(f, "{name}"),
53 ValidationPointer::Function(name) => write!(f, "{name}"),
54 }
55 }
56}