browser_automation_cli/
error.rs1use std::fmt;
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq)]
25pub enum ErrorKind {
26 Usage,
28 Data,
30 NoInput,
32 Unavailable,
34 Software,
36 Browser,
38 Protocol,
40 Timeout,
42 Cancelled,
44 BrokenPipe,
46 Config,
48 Io,
50}
51
52impl ErrorKind {
53 pub fn exit_code(self) -> u8 {
55 match self {
56 ErrorKind::Usage => 2,
57 ErrorKind::Data => 65,
58 ErrorKind::NoInput => 66,
59 ErrorKind::Unavailable => 69,
60 ErrorKind::Software | ErrorKind::Browser | ErrorKind::Protocol => 70,
61 ErrorKind::Config => 78,
62 ErrorKind::Io => 74,
63 ErrorKind::Timeout => 124,
64 ErrorKind::Cancelled => 130,
65 ErrorKind::BrokenPipe => 141,
66 }
67 }
68
69 pub fn as_str(self) -> &'static str {
71 match self {
72 ErrorKind::Usage => "usage",
73 ErrorKind::Data => "data",
74 ErrorKind::NoInput => "no-input",
75 ErrorKind::Unavailable => "unavailable",
76 ErrorKind::Software => "software",
77 ErrorKind::Browser => "browser",
78 ErrorKind::Protocol => "protocol",
79 ErrorKind::Timeout => "timeout",
80 ErrorKind::Cancelled => "cancelled",
81 ErrorKind::BrokenPipe => "broken-pipe",
82 ErrorKind::Config => "config",
83 ErrorKind::Io => "io",
84 }
85 }
86}
87
88#[derive(Debug, Clone)]
90pub struct CliError {
91 kind: ErrorKind,
92 message: String,
93 suggestion: Option<String>,
94}
95
96impl CliError {
97 pub fn new(kind: ErrorKind, message: impl Into<String>) -> Self {
99 Self {
100 kind,
101 message: message.into(),
102 suggestion: None,
103 }
104 }
105
106 pub fn with_suggestion(
108 kind: ErrorKind,
109 message: impl Into<String>,
110 suggestion: impl Into<String>,
111 ) -> Self {
112 Self {
113 kind,
114 message: message.into(),
115 suggestion: Some(suggestion.into()),
116 }
117 }
118
119 pub fn kind(&self) -> ErrorKind {
121 self.kind
122 }
123
124 pub fn message(&self) -> &str {
126 &self.message
127 }
128
129 pub fn suggestion(&self) -> Option<&str> {
131 self.suggestion.as_deref()
132 }
133
134 pub fn exit_code(&self) -> u8 {
136 self.kind.exit_code()
137 }
138}
139
140impl fmt::Display for CliError {
141 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
142 write!(f, "{}", self.message)
143 }
144}
145
146impl std::error::Error for CliError {}