cmus_status_line/
error.rs1use 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}