use std::fmt::{self, Display}; /// Path to the current value in the input, like `dependencies.serde.typo1`. #[derive(Copy, Clone)] pub enum Path<'a> { Root, Seq { parent: &'a Path<'a>, index: usize }, Map { parent: &'a Path<'a>, key: &'a str }, Alias { parent: &'a Path<'a> }, Unknown { parent: &'a Path<'a> }, } impl<'a> Display for Path<'a> { fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> { struct Parent<'a>(&'a Path<'a>); impl<'a> Display for Parent<'a> { fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> { match self.0 { Path::Root => Ok(()), path => write!(formatter, "{}.", path), } } } match self { Path::Root => formatter.write_str("."), Path::Seq { parent, index } => write!(formatter, "{}[{}]", parent, index), Path::Map { parent, key } => write!(formatter, "{}{}", Parent(parent), key), Path::Alias { parent } => write!(formatter, "{}", parent), Path::Unknown { parent } => write!(formatter, "{}?", Parent(parent)), } } }