use crate::result::Result;
use crate::volume::util::get_datetime;
use chrono::{DateTime, Duration, Utc};
use std::fmt;
use std::fmt::{Debug, Formatter};
use std::io::Read;
#[repr(C)]
#[derive(Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize))]
pub struct Header {
tape_filename: [u8; 9],
extension_number: [u8; 3],
date: u32,
time: u32,
icao_of_radar: [u8; 4],
}
impl Header {
#[cfg(all(feature = "serde", feature = "bincode"))]
pub fn deserialize<R: Read>(reader: &mut R) -> Result<Self> {
use bincode::{DefaultOptions, Options};
Ok(DefaultOptions::new()
.with_fixint_encoding()
.with_big_endian()
.deserialize_from(reader.by_ref())?)
}
pub fn tape_filename(&self) -> Option<String> {
String::from_utf8(self.tape_filename.to_vec()).ok()
}
pub fn extension_number(&self) -> Option<String> {
String::from_utf8(self.extension_number.to_vec()).ok()
}
pub fn date_time(&self) -> Option<DateTime<Utc>> {
get_datetime(self.date as u16, Duration::milliseconds(self.time as i64))
}
pub fn icao_of_radar(&self) -> Option<String> {
String::from_utf8(self.icao_of_radar.to_vec()).ok()
}
}
impl Debug for Header {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_struct("Header")
.field("tape_filename", &self.tape_filename())
.field("extension_number", &self.extension_number())
.field("date_time", &self.date_time())
.field("icao_of_radar", &self.icao_of_radar())
.finish()
}
}