use std::io;
use super::{Array, Shape};
mod header;
use header::{Endian, Header, HeaderDict, Type, TypeDescriptor, Version};
pub(crate) const MAGIC: [u8; 6] = *b"\x93NUMPY";
pub fn read_array<R>(reader: &mut R) -> io::Result<Array<f64>>
where
R: io::BufRead,
{
let header = Header::read(reader)?;
let dict = header.dict;
match (dict.type_descriptor, dict.fortran_order) {
(_, true) => Err(io::Error::new(
io::ErrorKind::InvalidData,
"Fortran order not supported when reading npy",
)),
(descr, false) => {
let values = descr.read(reader)?;
Array::new(values, Shape(dict.shape)).map_err(|_| {
io::Error::new(io::ErrorKind::InvalidData, "npy shape does not fit values")
})
}
}
}
pub fn write_array<W>(writer: &mut W, array: &Array<f64>) -> io::Result<()>
where
W: io::Write,
{
let header = Header::new(
Version::V1,
HeaderDict::new(
TypeDescriptor::new(Endian::Little, Type::F8),
false,
array.shape().as_ref().to_vec(),
),
);
header.write(writer)?;
for v in array.iter() {
writer.write_all(&v.to_le_bytes())?;
}
Ok(())
}