use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ErrorCode {
ParseError,
IoError,
ValidationError,
StateError,
WindowCreateError,
EventLoopError,
InternalError,
HostError,
HostBindError,
HostViewerError,
UiNotFound,
UnsupportedType,
WorkflowError,
SessionTimeoutError,
}
impl ErrorCode {
pub fn exit_code(self) -> i32 {
match self {
Self::ParseError => 2,
Self::IoError => 3,
Self::ValidationError => 4,
Self::StateError => 5,
Self::WindowCreateError
| Self::HostError
| Self::HostViewerError
| Self::UiNotFound
| Self::UnsupportedType
| Self::SessionTimeoutError => 6,
Self::EventLoopError | Self::HostBindError => 7,
Self::InternalError => 8,
Self::WorkflowError => 9,
}
}
pub fn error_slug(self) -> &'static str {
match self {
Self::ParseError => "parse",
Self::IoError => "io",
Self::ValidationError => "validation",
Self::StateError => "state",
Self::WindowCreateError => "window_create",
Self::EventLoopError => "event_loop",
Self::InternalError => "internal",
Self::HostError
| Self::UiNotFound
| Self::UnsupportedType
| Self::SessionTimeoutError => "host_error",
Self::HostBindError => "host_bind",
Self::HostViewerError => "host_viewer",
Self::WorkflowError => "workflow",
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_code_serde_is_screaming_snake() {
let cases = [
(ErrorCode::ParseError, "PARSE_ERROR"),
(ErrorCode::IoError, "IO_ERROR"),
(ErrorCode::ValidationError, "VALIDATION_ERROR"),
(ErrorCode::StateError, "STATE_ERROR"),
(ErrorCode::WindowCreateError, "WINDOW_CREATE_ERROR"),
(ErrorCode::EventLoopError, "EVENT_LOOP_ERROR"),
(ErrorCode::InternalError, "INTERNAL_ERROR"),
(ErrorCode::HostError, "HOST_ERROR"),
(ErrorCode::HostBindError, "HOST_BIND_ERROR"),
(ErrorCode::HostViewerError, "HOST_VIEWER_ERROR"),
(ErrorCode::UiNotFound, "UI_NOT_FOUND"),
(ErrorCode::UnsupportedType, "UNSUPPORTED_TYPE"),
(ErrorCode::WorkflowError, "WORKFLOW_ERROR"),
(ErrorCode::SessionTimeoutError, "SESSION_TIMEOUT_ERROR"),
];
for (code, expected) in cases {
let json = serde_json::to_string(&code).expect("serialize");
assert_eq!(json, format!("\"{expected}\""));
let round: ErrorCode = serde_json::from_str(&json).expect("deserialize");
assert_eq!(round, code);
}
}
}