system-updater/src/errors.rs
2023-01-07 17:08:44 +01:00

59 lines
1.7 KiB
Rust

use std::error;
use std::fmt;
/// An error that can occur in this crate.
///
/// Generally, this error corresponds to problems with underlying process.
#[derive(Debug)]
pub struct Error {
source: Vec<Error>,
kind: ErrorKind,
}
#[derive(Debug)]
#[non_exhaustive]
pub enum ErrorKind {
Config,
Fetch, // TODO: merge into "Update" or "Command" type of error? => Have this as an other level of error?
Compile, // TODO: merge into "Update" or "Command" type of error? => Have this as an other level of error?
Install, // TODO: merge into "Update" or "Command" type of error? => Have this as an other level of error?
}
impl Error {
pub(crate) fn new(source: Vec<Error>, kind: ErrorKind) -> Error {
Error { source, kind }
}
/// Return the kind of this error.
pub fn kind(&self) -> &ErrorKind {
&self.kind
}
}
impl error::Error for Error {
fn source(&self) -> Option<&(dyn error::Error + 'static)> {
if self.source.is_empty() {
None
} else {
Some(&self.source[0])
}
}
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
use std::error::Error;
match self.kind {
ErrorKind::Config => write!(
f,
"Could not read configuration file: {}",
self.source().unwrap()
),
ErrorKind::Fetch => write!(f, "Could not install: {}", self.source().unwrap()),
ErrorKind::Compile => write!(f, "Could not install: {}", self.source().unwrap()),
ErrorKind::Install => write!(f, "Could not install: {}", self.source().unwrap()),
}
}
}