use super::bds08;
use deku::prelude::*;
use serde::{Deserialize, Serialize};
#[derive(
Debug, PartialEq, Serialize, Deserialize, DekuRead, Clone, Default,
)]
#[serde(tag = "bds", rename = "20")]
pub struct AircraftIdentification {
#[deku(bits = "8", map = "fail_if_not20")]
#[serde(skip)]
pub bds: u8,
#[deku(reader = "bds08::callsign_read(deku::reader)")]
pub callsign: String,
}
fn fail_if_not20(value: u8) -> Result<u8, DekuError> {
if value == 0x20 {
Ok(value)
} else {
Err(DekuError::Assertion(
"First bits must be 0x20 in BDS 2,0".into(),
))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::prelude::*;
use hexlit::hex;
#[test]
fn test_valid_bds20() {
let bytes = hex!("a0001838201584f23468207cdfa5");
let (_, msg) = Message::from_bytes((&bytes, 0)).unwrap();
if let CommBAltitudeReply { bds, .. } = msg.df {
assert_eq!(
bds.bds20,
Some(super::AircraftIdentification {
bds: 32,
callsign: "EXS2MF".to_string()
})
);
} else {
unreachable!();
}
}
#[test]
fn test_invalid_bds20() {
let bytes = hex!("a800178d10010080f50000d5893c");
let (_, msg) = Message::from_bytes((&bytes, 0)).unwrap();
if let CommBIdentityReply { bds, .. } = msg.df {
assert_eq!(bds.bds20, None);
} else {
unreachable!();
}
}
}