Skip to main content

cccc_sdk/
error.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::fmt;
4
5/// Structured application error returned by the CCCC daemon.
6#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
7pub struct DaemonError {
8    pub code: String,
9    pub message: String,
10    #[serde(default)]
11    pub details: Value,
12}
13
14impl fmt::Display for DaemonError {
15    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
16        write!(formatter, "{}: {}", self.code, self.message)
17    }
18}
19
20impl std::error::Error for DaemonError {}
21
22/// Errors produced while discovering, connecting to, or calling CCCC.
23#[derive(Debug, thiserror::Error)]
24pub enum Error {
25    #[error("CCCC daemon endpoint was not found: {0}")]
26    EndpointNotFound(String),
27
28    #[error("invalid CCCC daemon endpoint descriptor: {0}")]
29    InvalidEndpoint(String),
30
31    #[error("Unix sockets are unavailable on this platform")]
32    UnixSocketUnsupported,
33
34    #[error("CCCC daemon I/O failed: {0}")]
35    Io(#[from] std::io::Error),
36
37    #[error("CCCC daemon returned invalid JSON: {0}")]
38    Json(#[from] serde_json::Error),
39
40    #[error("CCCC daemon response exceeded {0} bytes")]
41    ResponseTooLarge(usize),
42
43    #[error("CCCC daemon request exceeded {0} bytes")]
44    RequestTooLarge(usize),
45
46    #[error("CCCC daemon closed the connection without a response")]
47    EmptyResponse,
48
49    #[error("CCCC daemon response used unsupported IPC version {0}")]
50    UnsupportedIpcVersion(u32),
51
52    #[error("CCCC daemon error {0}")]
53    Daemon(#[from] DaemonError),
54
55    #[error("incompatible CCCC daemon: {0}")]
56    Incompatible(String),
57}
58
59pub type Result<T> = std::result::Result<T, Error>;