Skip to main content

lovely/
error.rs

1use std::fmt::{self, Display};
2use std::io;
3use std::path::PathBuf;
4
5#[derive(Debug)]
6pub enum LovelyError {
7    Io {
8        path: Option<PathBuf>,
9        source: io::Error,
10    },
11    Config(String),
12    Lock(String),
13    Archive(String),
14    Command(String),
15}
16
17impl LovelyError {
18    pub fn io(path: impl Into<PathBuf>, source: io::Error) -> Self {
19        Self::Io {
20            path: Some(path.into()),
21            source,
22        }
23    }
24
25    pub fn plain_io(source: io::Error) -> Self {
26        Self::Io { path: None, source }
27    }
28}
29
30impl Display for LovelyError {
31    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32        match self {
33            LovelyError::Io {
34                path: Some(path),
35                source,
36            } => {
37                write!(f, "{}: {}", path.display(), source)
38            }
39            LovelyError::Io { path: None, source } => write!(f, "{source}"),
40            LovelyError::Config(message) => write!(f, "configuration error: {message}"),
41            LovelyError::Lock(message) => write!(f, "lockfile error: {message}"),
42            LovelyError::Archive(message) => write!(f, "archive error: {message}"),
43            LovelyError::Command(message) => write!(f, "{message}"),
44        }
45    }
46}
47
48impl std::error::Error for LovelyError {
49    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
50        match self {
51            LovelyError::Io { source, .. } => Some(source),
52            _ => None,
53        }
54    }
55}
56
57pub type Result<T> = std::result::Result<T, LovelyError>;