use std::fmt;
#[derive(Clone, Debug, Default, PartialEq, Eq, Hash)]
pub struct FieldPath {
segments: Vec<FieldPathSegment>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum FieldPathSegment {
Name(&'static str),
Index(usize),
}
impl FieldPath {
pub fn segments(&self) -> &[FieldPathSegment] {
&self.segments
}
pub(crate) fn push(&mut self, segment: FieldPathSegment) {
self.segments.push(segment);
}
pub(crate) fn pop(&mut self) {
self.segments.pop();
}
pub(crate) fn extend(&mut self, segments: impl IntoIterator<Item = FieldPathSegment>) {
self.segments.extend(segments);
}
}
impl fmt::Display for FieldPath {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut text = String::new();
for (position, segment) in self.segments.iter().enumerate() {
match (position, segment) {
(0, FieldPathSegment::Name(name)) => text.push_str(name),
(_, FieldPathSegment::Name(name)) => text.push_str(&format!("[{name}]")),
(_, FieldPathSegment::Index(index)) => text.push_str(&format!("[{index}]")),
}
}
formatter.write_str(&text)
}
}