#[cfg(not(feature = "std"))]
use alloc::{string::String, vec::Vec};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum PathSegment {
Field(String),
Index(usize),
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct InspectPath {
segments: Vec<PathSegment>,
}
impl InspectPath {
pub fn new() -> Self {
Self { segments: Vec::new() }
}
pub fn field(mut self, name: impl Into<String>) -> Self {
self.segments.push(PathSegment::Field(name.into()));
self
}
pub fn index(mut self, idx: usize) -> Self {
self.segments.push(PathSegment::Index(idx));
self
}
pub fn segments(&self) -> &[PathSegment] {
&self.segments
}
pub fn is_empty(&self) -> bool {
self.segments.is_empty()
}
pub fn len(&self) -> usize {
self.segments.len()
}
}
impl core::fmt::Display for InspectPath {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
for (i, segment) in self.segments.iter().enumerate() {
match segment {
PathSegment::Field(name) => {
if i > 0 {
write!(f, ".")?;
}
write!(f, "{}", name)?;
}
PathSegment::Index(idx) => {
write!(f, "[{}]", idx)?;
}
}
}
Ok(())
}
}