1 use std::fmt::{self, Display};
2 
3 /// Path to the current value in the input, like `dependencies.serde.typo1`.
4 #[derive(Copy, Clone)]
5 pub enum Path<'a> {
6     Root,
7     Seq { parent: &'a Path<'a>, index: usize },
8     Map { parent: &'a Path<'a>, key: &'a str },
9     Alias { parent: &'a Path<'a> },
10     Unknown { parent: &'a Path<'a> },
11 }
12 
13 impl<'a> Display for Path<'a> {
fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error>14     fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
15         struct Parent<'a>(&'a Path<'a>);
16 
17         impl<'a> Display for Parent<'a> {
18             fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
19                 match self.0 {
20                     Path::Root => Ok(()),
21                     path => write!(formatter, "{}.", path),
22                 }
23             }
24         }
25 
26         match self {
27             Path::Root => formatter.write_str("."),
28             Path::Seq { parent, index } => write!(formatter, "{}[{}]", parent, index),
29             Path::Map { parent, key } => write!(formatter, "{}{}", Parent(parent), key),
30             Path::Alias { parent } => write!(formatter, "{}", parent),
31             Path::Unknown { parent } => write!(formatter, "{}?", Parent(parent)),
32         }
33     }
34 }
35