1use std::fmt;
8
9pub type Result<T> = std::result::Result<T, Error>;
11
12#[derive(Debug, Clone, PartialEq, Eq)]
14pub enum Error {
15 UnknownCapability(u128),
17 MethodNotGranted {
19 method: String,
21 },
22 Escalation(&'static str),
24 ReadOnly,
26 PathNotGranted(String),
28 ToolPolicy(&'static str),
30 Revoked(u128),
32 BudgetExceeded(&'static str),
34 UnknownLane(u64),
36 UnknownChannel(u64),
38 UnknownPromise(u64),
40 PromiseCancelled(u64),
42 PromiseAlreadyResolved(u64),
44 UnresolvablePromise(u64),
46 Provider {
48 code: String,
50 },
51 Domain(&'static str),
53 Payload(String),
55 Wire(&'static str),
57 CapabilityTable(&'static str),
59 Transport(String),
61 TransportUnavailable(&'static str),
63 Timeout,
65 PipelinedCycle,
67 InvalidArgument(&'static str),
69}
70
71impl Error {
72 pub const fn code(&self) -> &'static str {
74 match self {
75 Error::UnknownCapability(_) => "rpc/unknown-capability",
76 Error::MethodNotGranted { .. } => "rpc/method-not-granted",
77 Error::Escalation(_) => "rpc/attenuation-escalation",
78 Error::ReadOnly => "rpc/read-only",
79 Error::PathNotGranted(_) => "rpc/path-not-granted",
80 Error::ToolPolicy(_) => "rpc/tool-policy",
81 Error::Revoked(_) => "rpc/revoked",
82 Error::BudgetExceeded(_) => "rpc/budget-exceeded",
83 Error::UnknownLane(_) => "rpc/unknown-lane",
84 Error::UnknownChannel(_) => "rpc/unknown-channel",
85 Error::UnknownPromise(_) => "rpc/unknown-promise",
86 Error::PromiseCancelled(_) => "rpc/promise-cancelled",
87 Error::PromiseAlreadyResolved(_) => "rpc/promise-resolved",
88 Error::UnresolvablePromise(_) => "rpc/unresolvable-promise",
89 Error::Provider { .. } => "rpc/provider",
90 Error::Domain(_) => "rpc/domain",
91 Error::Payload(_) => "rpc/payload",
92 Error::Wire(_) => "rpc/wire",
93 Error::CapabilityTable(_) => "rpc/capability-table",
94 Error::Transport(_) => "rpc/transport",
95 Error::TransportUnavailable(_) => "rpc/transport-unavailable",
96 Error::Timeout => "rpc/timeout",
97 Error::PipelinedCycle => "rpc/pipelined-cycle",
98 Error::InvalidArgument(_) => "rpc/invalid-argument",
99 }
100 }
101
102 pub const fn is_fatal(&self) -> bool {
104 matches!(
105 self,
106 Error::Wire(_)
107 | Error::CapabilityTable(_)
108 | Error::Payload(_)
109 | Error::UnknownCapability(_)
110 )
111 }
112}
113
114impl fmt::Display for Error {
115 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
116 match self {
117 Error::UnknownCapability(id) => write!(f, "unknown capability {id:032x}"),
118 Error::MethodNotGranted { method } => write!(f, "method {method} is not granted"),
119 Error::Escalation(what) => write!(f, "attenuation would widen authority: {what}"),
120 Error::ReadOnly => write!(f, "capability is read-only"),
121 Error::PathNotGranted(path) => write!(f, "path {path} is outside the capability"),
122 Error::ToolPolicy(what) => write!(f, "tool policy rejects the call: {what}"),
123 Error::Revoked(id) => write!(f, "capability {id:032x} is revoked"),
124 Error::BudgetExceeded(kind) => write!(f, "{kind} budget exhausted"),
125 Error::UnknownLane(id) => write!(f, "unknown lane {id}"),
126 Error::UnknownChannel(id) => write!(f, "unknown channel {id}"),
127 Error::UnknownPromise(id) => write!(f, "unknown promise {id}"),
128 Error::PromiseCancelled(id) => write!(f, "promise {id} was cancelled"),
129 Error::PromiseAlreadyResolved(id) => write!(f, "promise {id} was already resolved"),
130 Error::UnresolvablePromise(id) => write!(f, "promise {id} can never resolve"),
131 Error::Provider { code } => write!(f, "provider failed: {code}"),
132 Error::Domain(code) => write!(f, "domain operation failed: {code}"),
133 Error::Payload(reason) => write!(f, "invalid payload: {reason}"),
134 Error::Wire(reason) => write!(f, "malformed envelope: {reason}"),
135 Error::CapabilityTable(reason) => write!(f, "malformed capability table: {reason}"),
136 Error::Transport(reason) => write!(f, "transport failure: {reason}"),
137 Error::TransportUnavailable(name) => write!(f, "transport {name} is unavailable"),
138 Error::Timeout => write!(f, "deadline elapsed"),
139 Error::PipelinedCycle => write!(f, "pipelined calls form a cycle"),
140 Error::InvalidArgument(what) => write!(f, "invalid argument: {what}"),
141 }
142 }
143}
144
145impl std::error::Error for Error {}
146
147impl From<active_infinity::Error> for Error {
148 fn from(error: active_infinity::Error) -> Self {
149 Error::Payload(error.code().to_string())
150 }
151}