use serde::{Deserialize, Serialize};
#[derive(Eq, PartialEq, Hash, Debug, Clone, Copy, Deserialize)]
pub enum EventKind {
#[serde(rename = "incoming")]
IncomingMessage,
#[serde(rename = "outgoing")]
OutgoingMessage,
#[serde(rename = "delivery")]
DeliveryReport,
#[serde(rename = "modem_status_update")]
ModemStatusUpdate,
#[serde(rename = "gnss_position_report")]
GNSSPositionReport,
}
impl EventKind {
pub const COUNT: usize = 5;
#[inline]
#[must_use]
pub const fn to_bit(self) -> u8 {
match self {
EventKind::IncomingMessage => 1 << 0,
EventKind::OutgoingMessage => 1 << 1,
EventKind::DeliveryReport => 1 << 2,
EventKind::ModemStatusUpdate => 1 << 3,
EventKind::GNSSPositionReport => 1 << 4,
}
}
#[inline]
#[must_use]
pub const fn all_bits() -> u8 {
(1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)
}
#[inline]
#[must_use]
pub fn events_to_mask(events: &[EventKind]) -> u8 {
events.iter().fold(0, |acc, event| acc | event.to_bit())
}
}
impl From<&Event> for EventKind {
fn from(value: &Event) -> Self {
match value {
Event::IncomingMessage(_) => EventKind::IncomingMessage,
Event::OutgoingMessage(_) => EventKind::OutgoingMessage,
Event::DeliveryReport { .. } => EventKind::DeliveryReport,
Event::ModemStatusUpdate { .. } => EventKind::ModemStatusUpdate,
#[cfg(feature = "gnss")]
Event::GnssPositionReport(_) => EventKind::GNSSPositionReport,
}
}
}
impl TryFrom<&str> for EventKind {
type Error = String;
#[inline]
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value {
"incoming" => Ok(EventKind::IncomingMessage),
"outgoing" => Ok(EventKind::OutgoingMessage),
"delivery" => Ok(EventKind::DeliveryReport),
"modem_status_update" => Ok(EventKind::ModemStatusUpdate),
"gnss_position_report" => Ok(EventKind::GNSSPositionReport),
_ => Err(format!("Unknown event type {value}")),
}
}
}
#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
#[serde(tag = "type", content = "data")]
pub enum Event {
#[serde(rename = "incoming")]
IncomingMessage(crate::sms::SmsMessage),
#[serde(rename = "outgoing")]
OutgoingMessage(crate::sms::SmsMessage),
#[serde(rename = "delivery")]
DeliveryReport {
message_id: i64,
report: crate::sms::SmsPartialDeliveryReport,
},
#[serde(rename = "modem_status_update")]
ModemStatusUpdate {
previous: crate::modem::ModemStatusUpdateState,
current: crate::modem::ModemStatusUpdateState,
},
#[cfg(feature = "gnss")]
#[serde(rename = "gnss_position_report")]
GnssPositionReport(crate::gnss::PositionReport),
}