use crate::type_aliases::component::Component;
use alloc::vec::Vec;
#[derive(Debug, Clone, Default, PartialEq)]
pub struct Path {
pub components: Vec<Component>,
}
impl Path {
pub fn from_component(component: Component) -> Path {
Path {
components: alloc::vec![component],
}
}
pub fn from_components(components: Vec<Component>) -> Path {
Path { components }
}
pub fn append(&self, suffix: &Path) -> Path {
let mut joined = self.components.clone();
joined.reserve(suffix.components.len());
joined.extend(suffix.components.iter().cloned());
Path { components: joined }
}
pub fn push(&self, component: Component) -> Path {
let mut joined = self.components.clone();
joined.push(component);
Path { components: joined }
}
pub fn push_front(&self, component: Component) -> Path {
let mut joined = Vec::with_capacity(self.components.len() + 1);
joined.push(component);
joined.extend(self.components.iter().cloned());
Path { components: joined }
}
pub fn pop(&self) -> Path {
if self.path_empty() {
return Path::default(); }
let mut popped = self.components.clone();
popped.pop();
Path { components: popped }
}
pub fn last(&self) -> Option<Component> {
self.components.last().cloned()
}
pub fn path_empty(&self) -> bool {
self.components.is_empty()
}
pub fn operator_eq(&self, other: &Path) -> bool {
self.components == other.components
}
}