Skip to main content

lilo_rm_core/
error.rs

1use std::fmt::{Display, Formatter};
2
3use serde::{Deserialize, Serialize};
4use thiserror::Error;
5
6#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
7#[serde(rename_all = "snake_case")]
8pub enum ErrorCode {
9    RuntimeUnavailable,
10    SessionNotFound,
11    TmuxPaneDead,
12    HeadlessNudgeUnsupported,
13    LaunchFailed,
14    InvalidTarget,
15    ProtocolMismatch,
16}
17
18impl ErrorCode {
19    pub fn as_str(self) -> &'static str {
20        match self {
21            Self::RuntimeUnavailable => "runtime_unavailable",
22            Self::SessionNotFound => "session_not_found",
23            Self::TmuxPaneDead => "tmux_pane_dead",
24            Self::HeadlessNudgeUnsupported => "headless_nudge_unsupported",
25            Self::LaunchFailed => "launch_failed",
26            Self::InvalidTarget => "invalid_target",
27            Self::ProtocolMismatch => "protocol_mismatch",
28        }
29    }
30}
31
32impl Display for ErrorCode {
33    fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
34        formatter.write_str(self.as_str())
35    }
36}
37
38#[derive(Debug, Error)]
39pub enum ProtocolError {
40    #[error("connection closed before a message arrived")]
41    Eof,
42    #[error("io error: {0}")]
43    Io(#[from] std::io::Error),
44    #[error("json error: {0}")]
45    Json(#[from] serde_json::Error),
46}
47
48#[derive(Debug, Error)]
49#[error("unsupported runtime kind: {0}")]
50pub struct RuntimeKindParseError(pub String);