bitcoincore_zmq/monitor/
mod.rs1pub mod event;
2
3use core::fmt;
4use event::SocketEvent;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct MonitorMessage {
9 pub event: SocketEvent,
10 pub source_url: String,
11}
12
13impl MonitorMessage {
14 pub fn parse_from(msg: &[zmq::Message]) -> Result<Self, MonitorMessageError> {
15 let [event_message, url_message] = msg else {
16 return Err(MonitorMessageError::InvalidMutlipartLength(msg.len()));
17 };
18
19 Ok(Self {
20 event: SocketEvent::parse_from(event_message)?,
21 source_url: String::from_utf8_lossy(url_message).into(),
22 })
23 }
24}
25
26#[derive(Debug)]
27#[allow(clippy::enum_variant_names)]
29pub enum MonitorMessageError {
30 InvalidMutlipartLength(usize),
31 InvalidEventFrameLength(usize),
32 InvalidEventData(u16, u32),
33}
34
35impl fmt::Display for MonitorMessageError {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 match self {
38 Self::InvalidMutlipartLength(len) => {
39 write!(f, "invalid multipart message length: {len} (expected 2)")
40 }
41 Self::InvalidEventFrameLength(len) => {
42 write!(f, "invalid event frame length: {len} (expected 6)")
43 }
44 Self::InvalidEventData(event_type, event_data) => {
45 write!(f, "invalid event data {event_data} for event {event_type}")
46 }
47 }
48 }
49}
50
51impl std::error::Error for MonitorMessageError {}