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>;