signal_msg/
lib.rs

1use simple_signal::{self};
2use std::sync::mpsc;
3
4// Copied from https://github.com/swizard0/rust-simple-signal/blob/master/src/lib.rs
5#[derive(Clone, Copy, PartialEq, Eq, Debug)]
6pub enum Signal {
7    Hup,
8    Int,
9    Quit,
10    Ill,
11    Abrt,
12    Fpe,
13    Kill,
14    Segv,
15    Pipe,
16    Alrm,
17    Term,
18}
19
20pub fn all() -> Vec<simple_signal::Signal> {
21    vec![
22        simple_signal::Signal::Hup,  // 0
23        simple_signal::Signal::Int,  // 1
24        simple_signal::Signal::Ill,  // 3
25        simple_signal::Signal::Abrt, // 4
26        simple_signal::Signal::Fpe,  // 5
27        simple_signal::Signal::Pipe, // 8
28        simple_signal::Signal::Alrm, // 9
29        simple_signal::Signal::Term, // 10
30    ]
31}
32
33pub fn from_i32(sig_num: i32) -> Result<Signal, String> {
34    match sig_num {
35        0 => Ok(Signal::Hup),
36        1 => Ok(Signal::Int),
37        3 => Ok(Signal::Ill),
38        4 => Ok(Signal::Abrt),
39        5 => Ok(Signal::Fpe),
40        8 => Ok(Signal::Pipe),
41        9 => Ok(Signal::Alrm),
42        10 => Ok(Signal::Term),
43        _ => Err(format!("Got unsupported signal: {:?}", sig_num)),
44    }
45}
46
47pub trait SignalSender {
48    fn prepare_signals(&self);
49}
50
51impl SignalSender for mpsc::Sender<i32> {
52    fn prepare_signals(&self) {
53        let s = self.clone();
54        simple_signal::set_handler(&all(), move |signals| {
55            for sig in signals {
56                s.send(*sig as i32).unwrap();
57            }
58        });
59    }
60}
61
62pub trait SignalReceiver {
63    fn listen(&self) -> Result<Signal, String>;
64}
65
66impl SignalReceiver for mpsc::Receiver<i32> {
67    fn listen(&self) -> Result<Signal, String> {
68        from_i32(self.recv().unwrap())
69    }
70}
71
72pub fn new() -> (mpsc::Sender<i32>, mpsc::Receiver<i32>) {
73    mpsc::channel()
74}