pub mod data;
pub mod header;
pub mod types;
pub mod variable;
use std::fs::File;
use std::path::Path;
use memmap2::Mmap;
use crate::error::Result;
use crate::types::NcGroup;
use crate::NcFormat;
pub(crate) enum ClassicData {
Mmap(Mmap),
Bytes(Vec<u8>),
}
impl ClassicData {
pub fn as_slice(&self) -> &[u8] {
match self {
ClassicData::Mmap(m) => m,
ClassicData::Bytes(b) => b,
}
}
}
pub struct ClassicFile {
pub(crate) format: NcFormat,
pub(crate) root_group: NcGroup,
pub(crate) data: ClassicData,
pub(crate) numrecs: u64,
}
impl ClassicFile {
pub fn open(path: &Path, format: NcFormat) -> Result<Self> {
let file = File::open(path)?;
let mmap = unsafe { Mmap::map(&file)? };
let header = header::parse_header(&mmap, format)?;
let root_group = NcGroup {
name: "/".to_string(),
dimensions: header.dimensions,
variables: header.variables,
attributes: header.global_attributes,
groups: Vec::new(), };
Ok(ClassicFile {
format,
root_group,
data: ClassicData::Mmap(mmap),
numrecs: header.numrecs,
})
}
pub fn from_bytes(bytes: &[u8], format: NcFormat) -> Result<Self> {
let header = header::parse_header(bytes, format)?;
let root_group = NcGroup {
name: "/".to_string(),
dimensions: header.dimensions,
variables: header.variables,
attributes: header.global_attributes,
groups: Vec::new(),
};
Ok(ClassicFile {
format,
root_group,
data: ClassicData::Bytes(bytes.to_vec()),
numrecs: header.numrecs,
})
}
pub fn from_mmap(mmap: Mmap, format: NcFormat) -> Result<Self> {
let header = header::parse_header(&mmap, format)?;
let root_group = NcGroup {
name: "/".to_string(),
dimensions: header.dimensions,
variables: header.variables,
attributes: header.global_attributes,
groups: Vec::new(),
};
Ok(ClassicFile {
format,
root_group,
data: ClassicData::Mmap(mmap),
numrecs: header.numrecs,
})
}
pub fn format(&self) -> NcFormat {
self.format
}
pub fn root_group(&self) -> &NcGroup {
&self.root_group
}
pub fn numrecs(&self) -> u64 {
self.numrecs
}
}