use hdf5_metno::types::{FloatSize, IntSize, TypeDescriptor};
use crate::utils::dtype::ElementDtype;
use super::ConvertError;
#[must_use]
pub(crate) fn element_dtype_from_hdf5_descriptor(desc: &TypeDescriptor) -> Option<ElementDtype> {
match desc {
TypeDescriptor::Float(FloatSize::U4) => Some(ElementDtype::F32),
TypeDescriptor::Float(FloatSize::U8) => Some(ElementDtype::F64),
TypeDescriptor::Boolean
| TypeDescriptor::Integer(IntSize::U1)
| TypeDescriptor::Unsigned(IntSize::U1) => Some(ElementDtype::U8),
TypeDescriptor::Integer(IntSize::U2) => Some(ElementDtype::I16),
TypeDescriptor::Integer(IntSize::U4) => Some(ElementDtype::I32),
TypeDescriptor::Integer(IntSize::U8) => Some(ElementDtype::I64),
TypeDescriptor::Unsigned(IntSize::U2) => Some(ElementDtype::U16),
TypeDescriptor::Unsigned(IntSize::U4) => Some(ElementDtype::U32),
TypeDescriptor::Unsigned(IntSize::U8) => Some(ElementDtype::U64),
_ => None,
}
}
#[must_use]
pub(crate) fn element_dtype_from_hdf5_dataset(ds: &hdf5_metno::Dataset) -> Option<ElementDtype> {
let desc = ds.dtype().ok()?.to_descriptor().ok()?;
element_dtype_from_hdf5_descriptor(&desc)
}
pub(crate) fn map_hdf5_element_dtype(
ds: &hdf5_metno::Dataset,
name: &str,
) -> Result<ElementDtype, ConvertError> {
let td = ds.dtype().map_err(|e| ConvertError::Hdf5(e.to_string()))?;
let desc = td
.to_descriptor()
.map_err(|e| ConvertError::Hdf5(e.to_string()))?;
element_dtype_from_hdf5_descriptor(&desc).ok_or(ConvertError::UnsupportedDtype {
name: name.to_owned(),
detail: format!("{desc:?}"),
})
}