use crate::haystack::encoding::zinc::decode::id::Id;
use std::fmt::{Display, Formatter, Result};
use std::ops::Index;
#[derive(PartialEq, Eq, PartialOrd, Clone, Debug)]
pub struct Path {
segments: Vec<Id>,
}
impl Path {
pub fn is_empty(&self) -> bool {
self.segments.is_empty()
}
pub fn len(&self) -> usize {
self.segments.len()
}
pub fn iter(&'_ self) -> std::slice::Iter<'_, Id> {
self.segments.iter()
}
}
impl From<Vec<Id>> for Path {
fn from(segments: Vec<Id>) -> Self {
Path { segments }
}
}
impl From<Id> for Path {
fn from(segment: Id) -> Self {
Path {
segments: vec![segment],
}
}
}
impl From<&str> for Path {
fn from(segment: &str) -> Self {
Path::from(Id::from(segment))
}
}
impl Index<usize> for Path {
type Output = Id;
fn index(&self, index: usize) -> &Self::Output {
&self.segments[index]
}
}
impl Display for Path {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
self.segments
.iter()
.enumerate()
.try_for_each(|(idx, id)| -> Result {
f.write_str(&id.to_string())?;
if idx < self.segments.len() - 1 {
f.write_str("->")
} else {
Ok(())
}
})
}
}