use crate::exit::{ExitReason, MonitorRef};
use crate::pid::Pid;
use crate::stream::StreamHandle;
pub type Message = Vec<u8>;
#[derive(Debug)]
pub enum Received {
Message(Message),
Stream(StreamHandle),
Down {
reference: MonitorRef,
pid: Pid,
reason: ExitReason,
},
Exit { from: Pid, reason: ExitReason },
}
impl Received {
pub fn message(self) -> Option<Message> {
match self {
Received::Message(bytes) => Some(bytes),
_ => None,
}
}
pub fn stream(self) -> Option<StreamHandle> {
match self {
Received::Stream(handle) => Some(handle),
_ => None,
}
}
}
impl PartialEq for Received {
fn eq(&self, other: &Self) -> bool {
match (self, other) {
(Received::Message(a), Received::Message(b)) => a == b,
(
Received::Down {
reference: r1,
pid: p1,
reason: rs1,
},
Received::Down {
reference: r2,
pid: p2,
reason: rs2,
},
) => r1 == r2 && p1 == p2 && rs1 == rs2,
(
Received::Exit {
from: f1,
reason: rs1,
},
Received::Exit {
from: f2,
reason: rs2,
},
) => f1 == f2 && rs1 == rs2,
_ => false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::exit::{ExitReason, MonitorRef};
#[test]
fn message_extracts_user_bytes_only() {
assert_eq!(
Received::Message(b"hi".to_vec()).message(),
Some(b"hi".to_vec())
);
let down = Received::Down {
reference: MonitorRef(1),
pid: Pid::from_raw(2),
reason: ExitReason::Crashed,
};
assert_eq!(down.message(), None);
let exit = Received::Exit {
from: Pid::from_raw(3),
reason: ExitReason::Normal,
};
assert_eq!(exit.message(), None);
}
#[test]
fn stream_extracts_only_a_stream() {
let (_writer, handle) = crate::stream::stream();
assert!(Received::Stream(handle).stream().is_some());
let (_w2, h2) = crate::stream::stream();
assert!(Received::Stream(h2).message().is_none());
assert!(Received::Message(b"x".to_vec()).stream().is_none());
}
#[test]
fn distinct_kinds_are_never_equal() {
assert_ne!(
Received::Message(b"x".to_vec()),
Received::Exit {
from: Pid::from_raw(1),
reason: ExitReason::Normal,
}
);
let (_w1, a) = crate::stream::stream();
let (_w2, b) = crate::stream::stream();
assert_ne!(Received::Stream(a), Received::Stream(b));
}
}