pub trait Location {
fn name(&self) -> &str;
fn attr_names(&self) -> crate::Result<Vec<String>>;
fn attr(&self, name: &str) -> crate::Result<crate::hl::attribute::Attribute>;
}
impl Location for crate::hl::file::File {
fn name(&self) -> &str { "/" }
fn attr_names(&self) -> crate::Result<Vec<String>> { self.attr_names() }
fn attr(&self, name: &str) -> crate::Result<crate::hl::attribute::Attribute> { self.attr(name) }
}
impl Location for crate::hl::group::Group {
fn name(&self) -> &str { self.name() }
fn attr_names(&self) -> crate::Result<Vec<String>> { self.attr_names() }
fn attr(&self, name: &str) -> crate::Result<crate::hl::attribute::Attribute> { self.attr(name) }
}
impl Location for crate::hl::dataset::Dataset {
fn name(&self) -> &str { self.name() }
fn attr_names(&self) -> crate::Result<Vec<String>> { self.attr_names() }
fn attr(&self, name: &str) -> crate::Result<crate::hl::attribute::Attribute> { self.attr(name) }
}
pub fn link_exists(
group: &crate::hl::group::Group,
name: &str,
) -> crate::Result<bool> {
let members = group.member_names()?;
Ok(members.iter().any(|n| n == name))
}