use std::io::Read;
use std::net::TcpListener;
use std::sync::mpsc;
pub type MonitorSender = mpsc::SyncSender<Command>;
pub type MonitorReceiver = mpsc::Receiver<Command>;
pub enum Command {
Refresh,
Shutdown,
Update(Vec<String>),
}
pub struct Monitor {
listener: TcpListener,
tx: MonitorSender,
}
impl Monitor {
pub fn new(tx: MonitorSender, port: usize) -> Self {
let listener = TcpListener::bind(format!("127.0.0.1:{}", port));
if listener.is_err() {
eprintln!(
"Could not bind to port {}! Another bar instance is probably \
running.",
port
);
std::process::exit(1);
}
Self { listener: listener.unwrap(), tx }
}
pub fn run(self) {
use Command::*;
for stream in self.listener.incoming() {
let mut stream = stream.unwrap();
let mut data = String::new();
stream.read_to_string(&mut data).unwrap();
let mut data = data.split(" ");
let result = match data.next() {
Some("refresh") => self.tx.send(Refresh),
Some("shutdown") => self.tx.send(Shutdown),
Some("update") => {
let names =
data.map(|name| name.to_string()).collect::<Vec<_>>();
self.tx.send(Update(names))
},
_ => Ok(()),
};
if let Err(_err) = result {
unimplemented!("Monitor panicked!")
}
}
}
}