use std::fmt::{self, Display};
#[derive(Copy, Clone, Debug, PartialEq)]
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 Display for Path<'_> {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
struct Parent<'a>(&'a Path<'a>);
impl Display for Parent<'_> {
fn fmt(
&self,
formatter: &mut fmt::Formatter<'_>,
) -> fmt::Result {
match self.0 {
Path::Root => Ok(()),
path => write!(formatter, "{}.", path),
}
}
}
match self {
Path::Root => formatter.write_str("."),
Path::Seq { parent, index } => {
write!(formatter, r"{}\[{}\]", Parent(parent), index)
}
Path::Map { parent, key } => {
write!(formatter, "{}{}", Parent(parent), key)
}
Path::Alias { parent } => {
write!(formatter, "{}", Parent(parent))
}
Path::Unknown { parent } => {
write!(formatter, "{}?", Parent(parent))
}
}
}
}