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 SDK argument: {0}")]
29    InvalidArgument(String),
30
31    #[error("invalid CCCC daemon endpoint descriptor: {0}")]
32    InvalidEndpoint(String),
33
34    #[error("Unix sockets are unavailable on this platform")]
35    UnixSocketUnsupported,
36
37    #[error("CCCC daemon I/O failed: {0}")]
38    Io(#[from] std::io::Error),
39
40    #[error("CCCC daemon returned invalid JSON: {0}")]
41    Json(#[from] serde_json::Error),
42
43    #[error("CCCC daemon response exceeded {0} bytes")]
44    ResponseTooLarge(usize),
45
46    #[error("CCCC daemon request exceeded {0} bytes")]
47    RequestTooLarge(usize),
48
49    #[error("CCCC daemon closed the connection without a response")]
50    EmptyResponse,
51
52    #[error("CCCC daemon request outcome is unknown for {op}: {message}")]
53    OutcomeUnknown { op: String, message: String },
54
55    #[error("CCCC daemon response used unsupported IPC version {0}")]
56    UnsupportedIpcVersion(u32),
57
58    #[error("CCCC daemon error {0}")]
59    Daemon(#[from] DaemonError),
60
61    #[error("incompatible CCCC daemon: {0}")]
62    Incompatible(String),
63}
64
65pub type Result<T> = std::result::Result<T, Error>;