use super::parser;
use netidx::path::Path;
use std::{borrow::Borrow, fmt, ops::Deref, result, str::FromStr};
#[derive(Debug, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub struct ModPath(pub Path);
impl FromStr for ModPath {
type Err = anyhow::Error;
fn from_str(s: &str) -> result::Result<Self, Self::Err> {
parser::parse_modpath(s)
}
}
impl ModPath {
pub fn root() -> ModPath {
ModPath(Path::root())
}
}
impl Borrow<str> for ModPath {
fn borrow(&self) -> &str {
self.0.borrow()
}
}
impl Deref for ModPath {
type Target = Path;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl fmt::Display for ModPath {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let len = Path::levels(&self.0);
for (i, part) in Path::parts(&self.0).enumerate() {
write!(f, "{part}")?;
if i < len - 1 {
write!(f, "::")?
}
}
Ok(())
}
}
impl<A> FromIterator<A> for ModPath
where
A: Borrow<str>,
{
fn from_iter<T: IntoIterator<Item = A>>(iter: T) -> Self {
ModPath(Path::from_iter(iter))
}
}
impl<I, A> From<I> for ModPath
where
A: Borrow<str>,
I: IntoIterator<Item = A>,
{
fn from(value: I) -> Self {
ModPath::from_iter(value)
}
}
impl PartialEq<[&str]> for ModPath {
fn eq(&self, other: &[&str]) -> bool {
Path::levels(&self.0) == other.len()
&& Path::parts(&self.0).zip(other.iter()).all(|(s0, s1)| s0 == *s1)
}
}
impl<const L: usize> PartialEq<[&str; L]> for ModPath {
fn eq(&self, other: &[&str; L]) -> bool {
Path::levels(&self.0) == L
&& Path::parts(&self.0).zip(other.iter()).all(|(s0, s1)| s0 == *s1)
}
}