use rs_teststand_bridge::{Ack, Error, MessageEvent};
#[derive(Debug, Clone, PartialEq)]
#[non_exhaustive]
pub enum Inbound {
Ack(Ack),
Event(Box<MessageEvent>),
}
impl Inbound {
#[must_use]
pub const fn as_ack(&self) -> Option<&Ack> {
match self {
Self::Ack(ack) => Some(ack),
Self::Event(_) => None,
}
}
#[must_use]
pub fn as_event(&self) -> Option<&MessageEvent> {
match self {
Self::Event(event) => Some(event),
Self::Ack(_) => None,
}
}
pub fn parse(text: &str) -> Result<Self, Error> {
let value: serde_json::Value = serde_json::from_str(text)?;
if value.get("command").is_some() {
Ok(Self::Ack(serde_json::from_str(text)?))
} else {
Ok(Self::Event(Box::new(serde_json::from_str(text)?)))
}
}
}