use super::error::PeerManagerError;
use std::sync::mpsc::{Receiver, TryRecvError};
#[derive(Debug, PartialEq, Clone)]
pub enum PeerManagerNotification {
Connected { peer: String },
Disconnected { peer: String },
}
pub struct PeerNotificationIter {
pub(super) recv: Receiver<PeerManagerNotification>,
}
impl PeerNotificationIter {
pub fn try_next(&self) -> Result<Option<PeerManagerNotification>, PeerManagerError> {
match self.recv.try_recv() {
Ok(notifications) => Ok(Some(notifications)),
Err(TryRecvError::Empty) => Ok(None),
Err(TryRecvError::Disconnected) => Err(PeerManagerError::SendMessageError(
"The peer manager is no longer running".into(),
)),
}
}
}
impl Iterator for PeerNotificationIter {
type Item = PeerManagerNotification;
fn next(&mut self) -> Option<Self::Item> {
match self.recv.recv() {
Ok(notification) => Some(notification),
Err(_) => {
None
}
}
}
}
#[cfg(test)]
pub mod tests {
use super::*;
use std::sync::mpsc::channel;
use std::thread;
#[test]
fn test_peer_manager_notifications() {
let (send, recv) = channel();
let notifcation_iter = PeerNotificationIter { recv };
let join_handle = thread::spawn(move || {
for i in 0..5 {
send.send(PeerManagerNotification::Connected {
peer: format!("test_peer{}", i),
})
.unwrap();
}
});
let mut notifications_sent = 0;
for notifcation in notifcation_iter {
assert_eq!(
notifcation,
PeerManagerNotification::Connected {
peer: format!("test_peer{}", notifications_sent),
}
);
notifications_sent += 1;
}
assert_eq!(notifications_sent, 5);
join_handle.join().unwrap();
}
}