use crate::node::{PathSegment, ReduceHint};
#[inline]
pub(super) fn str_to_segment(s: &str) -> PathSegment {
if let Ok(idx) = s.parse::<usize>() {
PathSegment::FieldOrIndex(s.into(), idx)
} else {
PathSegment::Field(s.into())
}
}
pub(super) fn parse_path_segments(path: &str) -> Vec<PathSegment> {
if path.is_empty() {
return Vec::new();
}
if !path.contains('.') {
return vec![str_to_segment(path)];
}
path.split('.').map(str_to_segment).collect()
}
pub(super) fn parse_var_path(path: &str) -> (ReduceHint, Vec<PathSegment>) {
if path == "current" {
(
ReduceHint::Current,
vec![PathSegment::Field("current".into())],
)
} else if path == "accumulator" {
(
ReduceHint::Accumulator,
vec![PathSegment::Field("accumulator".into())],
)
} else if let Some(rest) = path.strip_prefix("current.") {
let mut segs = vec![PathSegment::Field("current".into())];
segs.extend(parse_path_segments(rest));
(ReduceHint::CurrentPath, segs)
} else if let Some(rest) = path.strip_prefix("accumulator.") {
let mut segs = vec![PathSegment::Field("accumulator".into())];
segs.extend(parse_path_segments(rest));
(ReduceHint::AccumulatorPath, segs)
} else {
(ReduceHint::None, parse_path_segments(path))
}
}