ctrlc/
error.rs

1use crate::platform;
2use std::fmt;
3
4/// Ctrl-C error.
5#[derive(Debug)]
6pub enum Error {
7    /// Signal could not be found from the system.
8    NoSuchSignal(crate::SignalType),
9    /// Ctrl-C signal handler already registered.
10    MultipleHandlers,
11    /// Unexpected system error.
12    System(std::io::Error),
13}
14
15impl Error {
16    fn describe(&self) -> &str {
17        match *self {
18            Error::NoSuchSignal(_) => "Signal could not be found from the system",
19            Error::MultipleHandlers => "Ctrl-C signal handler already registered",
20            Error::System(_) => "Unexpected system error",
21        }
22    }
23}
24
25impl From<platform::Error> for Error {
26    fn from(e: platform::Error) -> Error {
27        #[cfg(not(windows))]
28        if e == platform::Error::EEXIST {
29            return Error::MultipleHandlers;
30        }
31
32        let system_error = std::io::Error::new(std::io::ErrorKind::Other, e);
33        Error::System(system_error)
34    }
35}
36
37impl fmt::Display for Error {
38    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39        write!(f, "Ctrl-C error: {}", self.describe())
40    }
41}
42
43impl std::error::Error for Error {
44    fn description(&self) -> &str {
45        self.describe()
46    }
47
48    fn cause(&self) -> Option<&dyn std::error::Error> {
49        match *self {
50            Error::System(ref e) => Some(e),
51            _ => None,
52        }
53    }
54}