1use std::fmt;
2
3#[derive(Debug, Clone)]
4pub struct CliError {
5 message: String,
6 exit_code: u8,
7}
8
9impl CliError {
10 pub fn usage(message: impl Into<String>) -> Self {
11 Self::new(message, 2)
12 }
13
14 pub fn unsupported_platform() -> Self {
15 Self::usage("screen-record is only supported on macOS (12+) and Linux (X11)")
16 }
17
18 pub fn runtime(message: impl Into<String>) -> Self {
19 Self::new(message, 1)
20 }
21
22 fn new(message: impl Into<String>, exit_code: u8) -> Self {
23 let mut message = message.into();
24 if !message.starts_with("error:") {
25 message = format!("error: {message}");
26 }
27 Self { message, exit_code }
28 }
29
30 pub fn exit_code(&self) -> u8 {
31 self.exit_code
32 }
33}
34
35impl fmt::Display for CliError {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 write!(f, "{}", self.message)
38 }
39}
40
41impl std::error::Error for CliError {}