use crate::result::Result;
use crate::volume::{split_compressed_records, Header, Record};
pub struct File(Vec<u8>);
impl File {
pub fn new(data: Vec<u8>) -> Self {
Self(data)
}
pub fn data(&self) -> &Vec<u8> {
&self.0
}
#[cfg(all(feature = "serde", feature = "bincode"))]
pub fn header(&self) -> Result<Header> {
Header::deserialize(&mut self.0.as_slice())
}
pub fn records(&self) -> Vec<Record> {
split_compressed_records(&self.0[size_of::<Header>()..])
}
#[cfg(all(feature = "nexrad-model", feature = "decode", feature = "bzip2"))]
pub fn scan(&self) -> Result<nexrad_model::data::Scan> {
use crate::result::Error;
use nexrad_decode::messages::Message;
use nexrad_model::data::{Scan, Sweep};
let mut coverage_pattern_number = None;
let mut radials = Vec::new();
for mut record in self.records() {
if record.compressed() {
record = record.decompress()?;
}
let messages = record.messages()?;
for message in messages {
if let Message::DigitalRadarData(radar_data_message) = message.message {
if coverage_pattern_number.is_none() {
if let Some(volume_block) = &radar_data_message.volume_data_block {
coverage_pattern_number =
Some(volume_block.volume_coverage_pattern_number);
}
}
radials.push(radar_data_message.into_radial()?);
}
}
}
Ok(Scan::new(
coverage_pattern_number.ok_or(Error::MissingCoveragePattern)?,
Sweep::from_radials(radials),
))
}
}