asimov_module/resolve/
error.rs

1// This is free and unencumbered software released into the public domain.
2
3use alloc::string::String;
4
5#[cfg(feature = "std")]
6#[derive(Debug, thiserror::Error)]
7pub enum FromDirError {
8    #[error("failed to read manifest directory `{path}`: {source}")]
9    ManifestDirIo {
10        path: std::path::PathBuf,
11        #[source]
12        source: std::io::Error,
13    },
14    #[error("failed to read manifest file `{path}`: {source}")]
15    ManifestIo {
16        path: std::path::PathBuf,
17        #[source]
18        source: std::io::Error,
19    },
20    #[error("failed to parse manifest file `{path}`: {source}")]
21    Parse {
22        path: std::path::PathBuf,
23        #[source]
24        source: serde_yml::Error,
25    },
26    #[error("failed to add manifest file `{path}` to resolver: {source}")]
27    Insert {
28        path: std::path::PathBuf,
29        #[source]
30        source: UrlParseError,
31    },
32}
33
34impl From<FromDirError> for clientele::SysexitsError {
35    fn from(value: FromDirError) -> Self {
36        use FromDirError::*;
37        use clientele::SysexitsError::*;
38        match value {
39            ManifestDirIo { .. } => EX_IOERR,
40            ManifestIo { .. } => EX_IOERR,
41            Parse { .. } => EX_CONFIG,
42            Insert { source, .. } => source.into(),
43        }
44    }
45}
46
47#[derive(Clone, Debug, thiserror::Error)]
48pub enum UrlParseError {
49    #[error("URL can't be empty")]
50    EmptyUrl,
51    #[error("invalid URL `{url}`: {source}")]
52    InvalidUrl {
53        url: String,
54        #[source]
55        source: url::ParseError,
56    },
57}
58
59impl From<UrlParseError> for clientele::SysexitsError {
60    fn from(_value: UrlParseError) -> Self {
61        clientele::SysexitsError::EX_USAGE
62    }
63}