use std::io;
use crate::header::DType;
use crate::type_str::TypeStr;
#[cfg(test)]
#[macro_use]
mod test_helpers;
pub use traits::{Serialize, Deserialize, AutoSerialize};
pub use traits::{TypeRead, TypeWrite, TypeWriteDyn, TypeReadDyn, DTypeError};
pub(crate) use traits::ErrorKind;
use traits::helper;
#[macro_use]
mod traits;
pub use slice::FixedSizeBytes;
mod slice;
mod primitive;
mod array_member;
fn invalid_data<T: ToString>(message: T) -> io::Error {
io::Error::new(io::ErrorKind::InvalidData, message.to_string())
}
fn expect_scalar_dtype<T: ?Sized>(dtype: &DType) -> Result<&TypeStr, DTypeError> {
dtype.as_scalar().ok_or_else(|| {
let dtype = dtype.descr();
let rust_type = std::any::type_name::<T>();
DTypeError(ErrorKind::ExpectedScalar { dtype, rust_type })
})
}