mod airport;
mod controlled_airspace;
mod restrictive_airspace;
mod runway;
mod waypoint;
pub use airport::Airport;
pub use controlled_airspace::ControlledAirspace;
pub use restrictive_airspace::RestrictiveAirspace;
pub use runway::Runway;
pub use waypoint::Waypoint;
use crate::record::RECORD_LENGTH;
#[derive(Debug)]
pub enum RecordKind {
Airport,
ControlledAirspace,
RestrictiveAirspace,
Waypoint,
Runway,
}
pub struct Records<'a> {
data: &'a [u8],
pos: usize,
}
impl<'a> Records<'a> {
pub fn new(data: &'a [u8]) -> Self {
Self { data, pos: 0 }
}
}
impl<'a> Iterator for Records<'a> {
type Item = (RecordKind, &'a [u8]);
fn next(&mut self) -> Option<Self::Item> {
while self.pos + RECORD_LENGTH <= self.data.len() {
match self.data[self.pos] {
b'S' | b'T' => {
let record = &self.data[self.pos..self.pos + RECORD_LENGTH];
self.pos += RECORD_LENGTH;
macro_rules! record {
($t:expr) => {
return Some(($t, record))
};
}
let sec_code = record[4];
let sub_code = record[5];
match (sec_code, sub_code) {
(b'E', b'A') | (b'P', b'C') => {
record!(RecordKind::Waypoint);
}
(b'P', b' ') => match record[12] {
b'A' => record!(RecordKind::Airport),
b'G' => {
if record[21] == b'0' {
record!(RecordKind::Runway)
}
}
_ => {}
},
(b'U', b'C') => record!(RecordKind::ControlledAirspace),
(b'U', b'R') => record!(RecordKind::RestrictiveAirspace),
_ => {}
}
}
_ => {
self.pos += 1;
}
}
}
None
}
}