1#[cfg(not(feature = "std"))]
4use alloc::{string::String, vec::Vec};
5
6#[derive(Debug, Clone, PartialEq, Eq, Hash)]
8pub enum PathSegment {
9 Field(String),
11
12 Index(usize),
14}
15
16#[derive(Debug, Clone, Default, PartialEq, Eq)]
34pub struct InspectPath {
35 segments: Vec<PathSegment>,
36}
37
38impl InspectPath {
39 pub fn new() -> Self {
41 Self { segments: Vec::new() }
42 }
43
44 pub fn field(mut self, name: impl Into<String>) -> Self {
46 self.segments.push(PathSegment::Field(name.into()));
47 self
48 }
49
50 pub fn index(mut self, idx: usize) -> Self {
52 self.segments.push(PathSegment::Index(idx));
53 self
54 }
55
56 pub fn segments(&self) -> &[PathSegment] {
58 &self.segments
59 }
60
61 pub fn is_empty(&self) -> bool {
63 self.segments.is_empty()
64 }
65
66 pub fn len(&self) -> usize {
68 self.segments.len()
69 }
70}
71
72impl core::fmt::Display for InspectPath {
73 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
74 for (i, segment) in self.segments.iter().enumerate() {
75 match segment {
76 PathSegment::Field(name) => {
77 if i > 0 {
78 write!(f, ".")?;
79 }
80 write!(f, "{}", name)?;
81 }
82 PathSegment::Index(idx) => {
83 write!(f, "[{}]", idx)?;
84 }
85 }
86 }
87 Ok(())
88 }
89}