use anyhow::Error;
use crossbeam_channel::Sender;
use crate::status::Status;
#[derive(Debug)]
pub struct Notifier {
thread_name: String,
sender: Sender<(String, Status)>,
}
impl Notifier {
pub(crate) fn new(thread_name: &str, sender: Sender<(String, Status)>) -> Self {
Self {
thread_name: String::from(thread_name),
sender,
}
}
#[inline]
pub fn busy(&self) {
self.sender
.send((String::from(&self.thread_name), Status::Busy))
.expect("Failed to send busy");
}
#[inline]
pub fn request_pause(&self) {
self.sender
.send((String::from(&self.thread_name), Status::RequestPause))
.expect("Failed to send request for pause");
}
#[inline]
pub fn request_resume(&self) {
self.sender
.send((String::from(&self.thread_name), Status::RequestResume))
.expect("Failed to send request for pause");
}
#[inline]
pub fn request_end(&self) {
self.sender
.send((String::from(&self.thread_name), Status::RequestEnd))
.expect("Failed to send request for end");
}
#[inline]
pub fn wait(&self) {
self.sender
.send((String::from(&self.thread_name), Status::Waiting))
.expect("Failed to send wait");
}
#[inline]
pub fn error(&self, err: Error) {
self.sender
.send((String::from(&self.thread_name), Status::Error(err)))
.expect("Failed to send error");
}
#[inline]
pub fn end(&self) {
self.sender
.send((String::from(&self.thread_name), Status::Ended))
.expect("Failed to send end");
}
}
#[cfg(test)]
mod tests {
use anyhow::anyhow;
use crossbeam_channel::unbounded;
use super::*;
#[test]
fn busy() {
let (sender, receiver) = unbounded();
let notifier = Notifier::new("name", sender);
notifier.busy();
let (name, status) = receiver.recv().unwrap();
assert_eq!(name, "name");
assert_eq!(status, Status::Busy);
}
#[test]
fn request_pause() {
let (sender, receiver) = unbounded();
let notifier = Notifier::new("name", sender);
notifier.request_pause();
let (name, status) = receiver.recv().unwrap();
assert_eq!(name, "name");
assert_eq!(status, Status::RequestPause);
}
#[test]
fn request_resume() {
let (sender, receiver) = unbounded();
let notifier = Notifier::new("name", sender);
notifier.request_resume();
let (name, status) = receiver.recv().unwrap();
assert_eq!(name, "name");
assert_eq!(status, Status::RequestResume);
}
#[test]
fn request_end() {
let (sender, receiver) = unbounded();
let notifier = Notifier::new("name", sender);
notifier.request_end();
let (name, status) = receiver.recv().unwrap();
assert_eq!(name, "name");
assert_eq!(status, Status::RequestEnd);
}
#[test]
fn error() {
let (sender, receiver) = unbounded();
let notifier = Notifier::new("name", sender);
notifier.error(anyhow!("Error"));
let (name, status) = receiver.recv().unwrap();
assert_eq!(name, "name");
assert_eq!(status, Status::Error(anyhow!("Error")));
}
#[test]
fn end() {
let (sender, receiver) = unbounded();
let notifier = Notifier::new("name", sender);
notifier.end();
let (name, status) = receiver.recv().unwrap();
assert_eq!(name, "name");
assert_eq!(status, Status::Ended);
}
}