1use crate::platform;
2use std::fmt;
3
4#[derive(Debug)]
6pub enum Error {
7 NoSuchSignal(crate::SignalType),
9 MultipleHandlers,
11 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}