use core::fmt;
use std::io;
use crate::signal::Signal;
#[non_exhaustive]
#[derive(Debug)]
pub enum Error {
AlreadyInstalled,
SignalRegistration {
signal: Signal,
source: io::Error,
},
InvalidState(&'static str),
Timeout(&'static str),
NoRuntime,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::AlreadyInstalled => {
f.write_str("signal handlers already installed for this coordinator")
}
Self::SignalRegistration { signal, source } => {
write!(f, "failed to register handler for {signal}: {source}")
}
Self::InvalidState(s) => write!(f, "invalid coordinator state: {s}"),
Self::Timeout(s) => write!(f, "operation timed out: {s}"),
Self::NoRuntime => f.write_str(
"no async-runtime feature and no ctrlc-fallback feature enabled; \
enable `tokio`, `async-std`, or `ctrlc-fallback`",
),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::SignalRegistration { source, .. } => Some(source),
_ => None,
}
}
}
pub type Result<T> = core::result::Result<T, Error>;