1use std::fmt;
4use std::path::Path;
5
6pub type Result<T> = std::result::Result<T, Error>;
8
9#[derive(Debug)]
11#[non_exhaustive]
12pub enum Error {
13 Io {
15 path: Box<Path>,
17 source: std::io::Error,
19 },
20 Format(String),
23}
24
25impl Error {
26 pub(crate) fn format(msg: impl Into<String>) -> Error {
28 Error::Format(msg.into())
29 }
30
31 pub(crate) fn io(path: &Path, source: std::io::Error) -> Error {
32 Error::Io {
33 path: path.into(),
34 source,
35 }
36 }
37}
38
39impl fmt::Display for Error {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 match self {
42 Error::Io { path, source } => write!(f, "{}: {source}", path.display()),
43 Error::Format(msg) => f.write_str(msg),
44 }
45 }
46}
47
48impl std::error::Error for Error {
49 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
50 match self {
51 Error::Io { source, .. } => Some(source),
52 Error::Format(_) => None,
53 }
54 }
55}