Skip to main content

may_clack/
error.rs

1//! Error
2
3use rustyline::error::ReadlineError;
4use std::{error::Error, fmt::Display};
5
6/// The error type for clack errors
7#[non_exhaustive]
8#[derive(Debug)]
9pub enum ClackError {
10	/// I/O error
11	IoError(std::io::Error),
12	/// Clack input cancelled
13	Cancelled,
14	/// Rustyline readline error
15	ReadlineError(ReadlineError),
16	/// No options specified
17	NoOptions,
18}
19
20impl Error for ClackError {
21	fn source(&self) -> Option<&(dyn Error + 'static)> {
22		match self {
23			ClackError::IoError(source) => Some(source),
24			ClackError::Cancelled => None,
25			ClackError::ReadlineError(source) => Some(source),
26			ClackError::NoOptions => None,
27		}
28	}
29}
30
31impl Display for ClackError {
32	fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
33		match self {
34			ClackError::IoError(_) => f.write_str("io error"),
35			ClackError::Cancelled => f.write_str("operation cancelled"),
36			ClackError::ReadlineError(_) => f.write_str("readline error"),
37			ClackError::NoOptions => f.write_str("no options specified"),
38		}
39	}
40}
41
42impl From<std::io::Error> for ClackError {
43	fn from(source: std::io::Error) -> Self {
44		ClackError::IoError(source)
45	}
46}
47
48impl From<ReadlineError> for ClackError {
49	fn from(source: ReadlineError) -> Self {
50		ClackError::ReadlineError(source)
51	}
52}