1use crate::{InternalError, access::AccessError, dto::prelude::*};
2use std::fmt::{self, Display};
3
4#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
11pub struct Error {
12 pub code: ErrorCode,
13 pub message: String,
14}
15
16impl Error {
17 #[must_use]
18 pub const fn new(code: ErrorCode, message: String) -> Self {
19 Self { code, message }
20 }
21
22 pub fn conflict(message: impl Into<String>) -> Self {
24 Self::new(ErrorCode::Conflict, message.into())
25 }
26
27 pub fn policy(code: ErrorCode, message: impl Into<String>) -> Self {
29 Self::new(code, message.into())
30 }
31
32 pub fn forbidden(message: impl Into<String>) -> Self {
34 Self::new(ErrorCode::Forbidden, message.into())
35 }
36
37 pub fn internal(message: impl Into<String>) -> Self {
39 Self::new(ErrorCode::Internal, message.into())
40 }
41
42 pub fn invalid(message: impl Into<String>) -> Self {
44 Self::new(ErrorCode::InvalidInput, message.into())
45 }
46
47 #[must_use]
49 pub fn operation_id_required() -> Self {
50 Self::new(
51 ErrorCode::OperationIdRequired,
52 "operation_id is required for this command".to_string(),
53 )
54 }
55
56 pub fn invariant(message: impl Into<String>) -> Self {
58 Self::new(ErrorCode::InvariantViolation, message.into())
59 }
60
61 pub fn exhausted(message: impl Into<String>) -> Self {
63 Self::new(ErrorCode::ResourceExhausted, message.into())
64 }
65
66 pub fn not_found(message: impl Into<String>) -> Self {
68 Self::new(ErrorCode::NotFound, message.into())
69 }
70
71 pub fn unauthorized(message: impl Into<String>) -> Self {
73 Self::new(ErrorCode::Unauthorized, message.into())
74 }
75
76 pub fn unavailable(message: impl Into<String>) -> Self {
78 Self::new(ErrorCode::Unavailable, message.into())
79 }
80}
81
82impl Display for Error {
83 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
84 write!(f, "[{:?}] {}", self.code, self.message)
85 }
86}
87
88impl From<AccessError> for Error {
89 fn from(err: AccessError) -> Self {
90 Self::from(InternalError::from(err))
91 }
92}
93
94#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
101#[non_exhaustive]
102#[remain::sorted]
103pub enum ErrorCode {
104 AuthKeyUnknown,
105 AuthMaterialStale,
106 AuthProofExpired,
107 Conflict,
108 Forbidden,
109 Internal,
110 InternalRpcMalformed,
111 InvalidInput,
112 InvariantViolation,
113 NotFound,
114 OperationIdRequired,
115 PolicyInstanceRequiresSingletonWithDirectory,
116 PolicyReplicaRequiresSingletonWithScaling,
117 PolicyRoleAlreadyRegistered,
118 PolicyShardRequiresSingletonWithSharding,
119 PolicySingletonAlreadyRegisteredUnderParent,
120 ResourceExhausted,
121 Unauthorized,
122 Unavailable,
123}