async_flow/io/
port_event.rs

1// This is free and unencumbered software released into the public domain.
2
3/// A port's state transition events (either connect, message, or disconnect).
4#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[cfg_attr(feature = "serde", serde(rename_all = "lowercase"))]
7pub enum PortEvent<T> {
8    Connect,
9    Message(T),
10    Disconnect,
11}
12
13impl<T> PortEvent<T> {
14    pub fn message(&self) -> Option<&T> {
15        match self {
16            Self::Message(message) => Some(message),
17            _ => None,
18        }
19    }
20
21    pub fn into_message(self) -> Option<T> {
22        match self {
23            Self::Message(message) => Some(message),
24            _ => None,
25        }
26    }
27
28    /// Checks whether the event is a connect event.
29    pub fn is_connect(&self) -> bool {
30        matches!(self, Self::Connect)
31    }
32
33    /// Checks whether the event is a message event.
34    pub fn is_message(&self) -> bool {
35        matches!(self, Self::Message(_))
36    }
37
38    /// Checks whether the event is a disconnect event.
39    pub fn is_disconnect(&self) -> bool {
40        matches!(self, Self::Disconnect)
41    }
42
43    pub fn as_str(&self) -> &str {
44        match self {
45            Self::Connect => "connect",
46            Self::Message(_) => "message",
47            Self::Disconnect => "disconnect",
48        }
49    }
50}
51
52impl<T> AsRef<str> for PortEvent<T> {
53    fn as_ref(&self) -> &str {
54        self.as_str()
55    }
56}