use crate::attribute::H5Attribute;
use crate::error::{Hdf5Error, Result};
use crate::file::{borrow_inner_mut, clone_inner, H5FileInner, SharedInner};
use crate::format::messages::datatype::DatatypeMessage;
pub struct H5NamedDatatype {
file_inner: SharedInner,
name: String,
}
impl H5NamedDatatype {
pub(crate) fn new_reader(file_inner: SharedInner, name: String) -> Self {
Self { file_inner, name }
}
pub fn name(&self) -> &str {
&self.name
}
pub fn datatype(&self) -> Result<DatatypeMessage> {
self.with_reader(|reader, name| Ok(reader.named_datatype(name)?.clone()))
}
pub fn attr_names(&self) -> Result<Vec<String>> {
self.with_reader(|reader, name| Ok(reader.named_datatype_attr_names(name)?))
}
pub fn attr(&self, attr_name: &str) -> Result<H5Attribute> {
let msg = self
.with_reader(|reader, name| Ok(reader.named_datatype_attr(name, attr_name)?.clone()))?;
Ok(H5Attribute::new_reader(clone_inner(&self.file_inner), msg))
}
pub fn header_attr_count(&self) -> Result<u64> {
self.with_reader(|reader, name| Ok(reader.named_datatype_header_attr_count(name)?))
}
fn with_reader<T>(
&self,
f: impl FnOnce(&mut crate::io::reader::Hdf5Reader, &str) -> Result<T>,
) -> Result<T> {
let mut inner = borrow_inner_mut(&self.file_inner);
match &mut *inner {
H5FileInner::Reader(reader) => f(reader, &self.name),
H5FileInner::Writer(_) => Err(Hdf5Error::InvalidState(
"committed datatypes are readable only in read mode".into(),
)),
H5FileInner::Closed => Err(Hdf5Error::InvalidState("file is closed".into())),
}
}
}