use crate::{
Airport, ClientEvent, SimConnectError, SimConnectObjectExt, SystemEvent, Waypoint, NDB, VOR,
};
#[derive(Debug)]
#[non_exhaustive]
pub enum Notification {
Open,
ClientEvent(ClientEvent),
SystemEvent(SystemEvent),
Object(Object),
AirportList(Vec<Airport>),
WaypointList(Vec<Waypoint>),
NdbList(Vec<NDB>),
VorList(Vec<VOR>),
Quit,
}
#[derive(Debug)]
pub struct Object {
pub(crate) type_name: String,
pub(crate) data_addr: *const u32,
}
impl Object {
pub fn try_transmute<T: SimConnectObjectExt, I>(&self) -> Result<I, SimConnectError> {
let type_name: String = std::any::type_name::<T>().into();
if self.type_name == type_name {
let data: I = unsafe { std::ptr::read_unaligned(self.data_addr as *const I) };
Ok(data)
} else {
Err(SimConnectError::ObjectMismatch {
actual: self.type_name.clone(),
expected: type_name,
})
}
}
}