diff --git a/CHANGELOG.md b/CHANGELOG.md index 94ef053..8b1d959 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ file. This change log follows the conventions of ## Changed +- `SimConnect::get_next_dispatch` will now return an error of type `SimConnectError::UnimplementedMessageType` instead of panicking on unrecognized notification types. +- `SimConnect::get_next_dispatch` will now return an error of type `SimConnectError::SimConnectException` instead of `Notification::Exception`. +- `SimConnectError::SimConnectUnrecognizedEvent` has been renamed to `SimConnectError::UnimplementedEventType`. +- `#[non_exhaustive]` has been added to the `SimConnectError` and `Notification` enums. - The tracing information has been adjusted to be at the `info` and `debug` levels instead of `info`. ## [v0.1.2] - 2022-10-22 diff --git a/simconnect-sdk/src/domain/notification.rs b/simconnect-sdk/src/domain/notification.rs index 6bc8589..66eac65 100644 --- a/simconnect-sdk/src/domain/notification.rs +++ b/simconnect-sdk/src/domain/notification.rs @@ -2,6 +2,7 @@ use crate::{Airport, Event, SimConnectError, SimConnectObjectExt, Waypoint, NDB, /// Notification received from SimConnect. #[derive(Debug)] +#[non_exhaustive] pub enum Notification { /// SimConnect open Open, @@ -19,8 +20,6 @@ pub enum Notification { VorList(Vec), /// SimConnect quit Quit, - /// SimConnect exception - Exception(u32), } /// Notification data object. diff --git a/simconnect-sdk/src/errors.rs b/simconnect-sdk/src/errors.rs index 2fe8358..ed8b4c0 100644 --- a/simconnect-sdk/src/errors.rs +++ b/simconnect-sdk/src/errors.rs @@ -2,13 +2,20 @@ use thiserror::Error; /// SimConnect SDK error. #[derive(Error, Debug)] +#[non_exhaustive] pub enum SimConnectError { /// SimConnect error. #[error("SimConnect error: {0}")] SimConnectError(i32), - #[error("SimConnect unrecognized: {0}")] - /// SimConnect unrecognized error. Occurs when an unimplemented event is received by the SDK. - SimConnectUnrecognizedEvent(u32), + /// SimConnect error. + #[error("SimConnect exception: {0}")] + SimConnectException(u32), + /// An unimplemented event type has been received by the SDK. + #[error("Unimplemented event in the SDK: {0}")] + UnimplementedEventType(u32), + /// An unimplemented message type has been received by the SDK. + #[error("Unimplemented notification in the SDK: {0}")] + UnimplementedMessageType(i32), /// Object already registered with the client instance. #[error("Object `{0}` has already been registered")] ObjectAlreadyRegistered(String), diff --git a/simconnect-sdk/src/simconnect/base.rs b/simconnect-sdk/src/simconnect/base.rs index aa5020d..bcf59a8 100644 --- a/simconnect-sdk/src/simconnect/base.rs +++ b/simconnect-sdk/src/simconnect/base.rs @@ -144,25 +144,24 @@ impl SimConnect { let span = span!(Level::TRACE, "SimConnect::get_next_dispatch"); let _enter = span.enter(); - let result = match recv_id { + match recv_id { bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_OPEN => { trace!("Received SIMCONNECT_RECV_OPEN"); - Some(Notification::Open) + Ok(Some(Notification::Open)) } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_QUIT => { trace!("Received SIMCONNECT_RECV_QUIT"); - Some(Notification::Quit) + Ok(Some(Notification::Quit)) } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EVENT => { trace!("Received SIMCONNECT_RECV_EVENT"); let event: &bindings::SIMCONNECT_RECV_EVENT = unsafe { &*(data_buf as *const bindings::SIMCONNECT_RECV_EVENT) }; - let event = Event::try_from(event.uEventID).map_err(|_| { - SimConnectError::SimConnectUnimplementedEvent(event.uEventID) - })?; + let event = Event::try_from(event.uEventID) + .map_err(|_| SimConnectError::UnimplementedEventType(event.uEventID))?; - Some(Notification::Event(event)) + Ok(Some(Notification::Event(event))) } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_SIMOBJECT_DATA => { trace!("Received SIMCONNECT_RECV_SIMOBJECT_DATA"); @@ -179,9 +178,9 @@ impl SimConnect { data_addr: std::ptr::addr_of!(event.dwData), }; - Some(Notification::Object(data)) + Ok(Some(Notification::Object(data))) } - _ => None, + _ => Ok(None), } } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_AIRPORT_LIST => { @@ -204,7 +203,7 @@ impl SimConnect { }) .collect::>(); - Some(Notification::AirportList(data)) + Ok(Some(Notification::AirportList(data))) } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_WAYPOINT_LIST => { trace!("Received SIMCONNECT_RECV_WAYPOINT_LIST"); @@ -227,7 +226,7 @@ impl SimConnect { }) .collect::>(); - Some(Notification::WaypointList(data)) + Ok(Some(Notification::WaypointList(data))) } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_NDB_LIST => { trace!("Received SIMCONNECT_RECV_NDB_LIST"); @@ -251,7 +250,7 @@ impl SimConnect { }) .collect::>(); - Some(Notification::NdbList(data)) + Ok(Some(Notification::NdbList(data))) } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_VOR_LIST => { trace!("Received SIMCONNECT_RECV_VOR_LIST"); @@ -321,7 +320,7 @@ impl SimConnect { }) .collect::>(); - Some(Notification::VorList(data)) + Ok(Some(Notification::VorList(data))) } bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_EXCEPTION => { let event: &bindings::SIMCONNECT_RECV_EXCEPTION = @@ -329,16 +328,14 @@ impl SimConnect { warn!("Received {:?}", event); - Some(Notification::Exception(event.dwException)) + Err(SimConnectError::SimConnectException(event.dwException)) } - bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_NULL => None, + bindings::SIMCONNECT_RECV_ID_SIMCONNECT_RECV_ID_NULL => Ok(None), id => { error!("Received unhandled notification ID: {}", id); - panic!("Got unrecognized notification: {id}"); + Err(SimConnectError::UnimplementedMessageType(id)) } - }; - - Ok(result) + } } }