blob: ffaebe0eb91eeef98f0d4f49523fe930f6888212 [file] [log] [blame]
use std::{error, fmt, io};
/// Convenience error combining possible errors which could occur while
/// initializing logging.
///
/// Fern does not use this error natively, but functions which set up fern and
/// open log files will often need to return both [`io::Error`] and
/// [`SetLoggerError`]. This error is for that purpose.
///
/// [`io::Error`]: https://doc.rust-lang.org/std/io/struct.Error.html
/// [`SetLoggerError`]: ../log/struct.SetLoggerError.html
#[derive(Debug)]
pub enum InitError {
/// IO error.
Io(io::Error),
/// The log crate's global logger was already initialized when trying to
/// initialize a logger.
SetLoggerError(log::SetLoggerError),
}
impl From<io::Error> for InitError {
fn from(error: io::Error) -> InitError {
InitError::Io(error)
}
}
impl From<log::SetLoggerError> for InitError {
fn from(error: log::SetLoggerError) -> InitError {
InitError::SetLoggerError(error)
}
}
impl fmt::Display for InitError {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
match *self {
InitError::Io(ref e) => write!(f, "IO Error initializing logger: {}", e),
InitError::SetLoggerError(ref e) => write!(f, "logging initialization failed: {}", e),
}
}
}
impl error::Error for InitError {
fn description(&self) -> &str {
match *self {
InitError::Io(..) => "IO error while initializing logging",
InitError::SetLoggerError(..) => {
"logging system already initialized with different logger"
}
}
}
fn cause(&self) -> Option<&dyn error::Error> {
match *self {
InitError::Io(ref e) => Some(e),
InitError::SetLoggerError(ref e) => Some(e),
}
}
}