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))
}