Skip to main content

cmus_status_line/
error.rs

1use std::fmt;
2use std::path::PathBuf;
3use std::process::ExitStatus;
4
5pub mod prelude {
6    pub use super::Error;
7    pub use super::MyResult;
8}
9
10pub type MyResult<T> = Result<T, Error>;
11
12#[derive(Debug)]
13pub enum Error {
14    CmusNotInstalled,
15    CmusError { status: ExitStatus, stderr: String },
16    CmusParseError(String),
17    CmusUnknownData(String),
18    CmusExpectDataArguments(usize, String),
19    CmusUnknownStatus(String),
20    CouldntParseTimeToNumber(String),
21    CmusMissingData(String),
22    CmusStatusNoData,
23    NoFormat,
24    InvalidFormatKeyword(String),
25    ProgressBarConfigMinLen(usize, String),
26    FailedParsingConfig(Option<PathBuf>, String),
27    NoConfig,
28    InvalidArgument(String),
29    InvalidCommandLen(String),
30    InvalidCommandOption(String, String),
31    CommandTakesNoOptions(String),
32}
33
34impl Error {
35    fn message(&self) -> String {
36        match self {
37            Error::CmusNotInstalled => "cmus is not installed.".to_string(),
38            Error::CmusError { status, stderr } => format!(
39                "cmus exited with status code {}\nstderr: {}",
40                status, stderr,
41            ),
42            Error::CmusParseError(msg) => {
43                format!("cmus-remote parsing error: {}", msg)
44            }
45            Error::CmusUnknownData(data_line) => {
46                format!("cmus-remote returned unknown data: {}", data_line)
47            }
48            Error::CmusExpectDataArguments(expected_args, data_line) => {
49                format!(
50                    "expected {} arguments for data line from cmus-remote: {}",
51                    expected_args, data_line
52                )
53            }
54            Error::CmusUnknownStatus(status) => {
55                format!("cmus-remote returned unknown status: {}", status)
56            }
57            Error::CouldntParseTimeToNumber(time_string) => format!(
58                "couldn't parse string to number, expected to be string of \
59                 seconds: {}",
60                time_string
61            ),
62            Error::CmusMissingData(data_name) => {
63                format!("missing required data from cmus-remote: {}", data_name)
64            }
65            Error::CmusStatusNoData => "CmusStatusBuilder needs CmusData, set \
66                                        with `CmusStatusBuilder::data` method"
67                .to_string(),
68            Error::NoFormat => {
69                "No output format given for status line".to_string()
70            }
71            Error::InvalidFormatKeyword(keyword) => format!(
72                "Given format keyword '{}' is not a valid keyword",
73                keyword,
74            ),
75            Error::ProgressBarConfigMinLen(min_len, config) => format!(
76                "ProgressBar config string must be at least {} characters \
77                 long: {}",
78                min_len, config,
79            ),
80            Error::FailedParsingConfig(Some(filepath), e) => {
81                format!("failed parsing config file at {:?}\n{}", filepath, e)
82            }
83            Error::FailedParsingConfig(None, e) => {
84                format!("failed parsing config TOML\n{}", e)
85            }
86            Error::NoConfig => "no config was given".to_string(),
87            Error::InvalidArgument(arg) => {
88                format!("invalid argument '{}'", arg)
89            }
90            Error::InvalidCommandLen(arg) => {
91                format!("invalid command arguments '{}'", arg)
92            }
93            Error::InvalidCommandOption(cmd, opt) => {
94                format!("invalid option '{}' for command '{}'", opt, cmd)
95            }
96            Error::CommandTakesNoOptions(cmd) => {
97                format!("command '{}' takes no options", cmd)
98            }
99        }
100    }
101}
102
103impl std::error::Error for Error {
104}
105
106impl fmt::Display for Error {
107    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
108        write!(f, "ERROR:\n{}\nExiting.", self.message())
109    }
110}