1use std::fmt::{Display, Formatter};
2use std::io;
3use std::u8::MAX;
4
5#[derive(Debug, Copy, Clone, PartialOrd, PartialEq)]
6pub enum StatusCode {
7 OK = 0,
8 IOError = 1,
9 UnknownAction = 2,
10 EngineError = 3,
11 NotFound = 4,
12 Complete = 5,
13 UnknownStatusCode = MAX as isize,
14}
15
16impl From<u8> for StatusCode {
17 fn from(code: u8) -> Self {
18 match code {
19 0 => StatusCode::OK,
20 1 => StatusCode::IOError,
21 2 => StatusCode::UnknownAction,
22 3 => StatusCode::EngineError,
23 4 => StatusCode::NotFound,
24 5 => StatusCode::Complete,
25 _ => StatusCode::UnknownStatusCode,
26 }
27 }
28}
29
30impl ToString for StatusCode {
31 fn to_string(&self) -> String {
32 match self {
33 StatusCode::OK => "OK".into(),
34 StatusCode::IOError => "IOError".into(),
35 StatusCode::UnknownAction => "UnknownAction".into(),
36 StatusCode::EngineError => "EngineError".into(),
37 StatusCode::NotFound => "NotFound".into(),
38 StatusCode::Complete => "Complete".into(),
39 StatusCode::UnknownStatusCode => "UnknownStatusCode".into(),
40 }
41 }
42}
43
44pub type Result<T> = core::result::Result<T, Error>;
45
46#[derive(Debug, Clone)]
47pub struct Error {
48 pub code: StatusCode,
49 pub message: String,
50}
51
52impl Error {
53 pub fn new(code: StatusCode, message: impl Into<String>) -> Self {
54 Self {
55 code,
56 message: message.into(),
57 }
58 }
59}
60
61impl Display for Error {
62 fn fmt(&self, f: &mut Formatter) -> core::fmt::Result {
63 write!(f, "{}: {}", self.code.to_string(), self.message)
64 }
65}
66
67impl From<io::Error> for Error {
68 fn from(err: io::Error) -> Self {
69 Self {
70 code: StatusCode::IOError,
71 message: err.to_string(),
72 }
73 }
74}
75
76impl std::error::Error for Error {}