1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::fmt;
4
5#[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#[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>;