1use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(tag = "kind", rename_all = "snake_case")]
14#[non_exhaustive]
15pub enum ErrorDetails {
16 #[serde(rename = "constraint_violation")]
18 ConstraintViolation {
19 collection: String,
20 constraint: String,
25 },
26 #[serde(rename = "write_conflict")]
27 WriteConflict {
28 collection: String,
29 document_id: String,
30 },
31 #[serde(rename = "deadline_exceeded")]
32 DeadlineExceeded,
33 #[serde(rename = "prevalidation_rejected")]
34 PrevalidationRejected { constraint: String },
35 #[serde(rename = "append_only_violation")]
36 AppendOnlyViolation { collection: String },
37 #[serde(rename = "balance_violation")]
38 BalanceViolation { collection: String },
39 #[serde(rename = "period_locked")]
40 PeriodLocked { collection: String },
41 #[serde(rename = "period_lock_misconfigured")]
42 PeriodLockMisconfigured {
43 collection: String,
44 ref_table: String,
45 status_column: String,
46 },
47 #[serde(rename = "state_transition_violation")]
48 StateTransitionViolation { collection: String },
49 #[serde(rename = "transition_check_violation")]
50 TransitionCheckViolation { collection: String },
51 #[serde(rename = "type_guard_violation")]
52 TypeGuardViolation { collection: String },
53 #[serde(rename = "retention_violation")]
54 RetentionViolation { collection: String },
55 #[serde(rename = "legal_hold_active")]
56 LegalHoldActive { collection: String },
57 #[serde(rename = "type_mismatch")]
58 TypeMismatch { collection: String },
59 #[serde(rename = "overflow")]
60 Overflow { collection: String },
61 #[serde(rename = "insufficient_balance")]
62 InsufficientBalance { collection: String },
63 #[serde(rename = "rate_exceeded")]
64 RateExceeded { gate: String },
65 #[serde(rename = "transaction_rollback")]
68 TransactionRollback { detail: String },
69 #[serde(rename = "active_sql_transaction")]
72 ActiveSqlTransaction { detail: String },
73
74 #[serde(rename = "collection_not_found")]
76 CollectionNotFound { collection: String },
77 #[serde(rename = "database_not_found")]
79 DatabaseNotFound { database: String },
80 #[serde(rename = "document_not_found")]
81 DocumentNotFound {
82 collection: String,
83 document_id: String,
84 },
85 #[serde(rename = "undefined_object")]
88 UndefinedObject { object: String },
89 #[serde(rename = "already_exists")]
91 AlreadyExists { object: String },
92 #[serde(rename = "object_not_ready")]
95 ObjectNotReady { object: String },
96 #[serde(rename = "not_found")]
99 NotFound { detail: String },
100 #[serde(rename = "dependent_objects_exist")]
103 DependentObjectsExist { object: String },
104 #[serde(rename = "collection_draining")]
105 CollectionDraining { collection: String },
106 #[serde(rename = "collection_deactivated")]
107 CollectionDeactivated {
108 collection: String,
109 retention_expires_at_ns: u64,
113 undrop_hint: String,
117 },
118
119 #[serde(rename = "plan_error")]
121 PlanError { phase: String, detail: String },
122 #[serde(rename = "sql_not_enabled")]
123 SqlNotEnabled,
124 #[serde(rename = "undefined_function")]
126 UndefinedFunction { name: String },
127 #[serde(rename = "undefined_column")]
129 UndefinedColumn { column: String },
130 #[serde(rename = "ambiguous_column")]
132 AmbiguousColumn { column: String },
133 #[serde(rename = "division_by_zero")]
135 DivisionByZero,
136 #[serde(rename = "data_exception")]
139 DataException { detail: String },
140 #[serde(rename = "program_limit_exceeded")]
143 ProgramLimitExceeded { detail: String },
144 #[serde(rename = "invalid_limit_value")]
146 InvalidLimitValue { clause: String, value: String },
147
148 #[serde(rename = "authorization_denied")]
150 AuthorizationDenied { resource: String },
151 #[serde(rename = "auth_expired")]
152 AuthExpired,
153 #[serde(rename = "authentication_failed")]
156 AuthenticationFailed,
157 #[serde(rename = "tenant_vector_dim_exceeded")]
159 TenantVectorDimExceeded { dim: u32, limit: u32 },
160 #[serde(rename = "tenant_graph_depth_exceeded")]
162 TenantGraphDepthExceeded { depth: u32, limit: u32 },
163
164 #[serde(rename = "handshake_failed")]
166 HandshakeFailed {
167 server_code: u8,
169 },
170
171 #[serde(rename = "sync_connection_failed")]
173 SyncConnectionFailed,
174 #[serde(rename = "sync_delta_rejected")]
175 SyncDeltaRejected {
176 compensation: Option<crate::sync::compensation::CompensationHint>,
177 },
178 #[serde(rename = "shape_subscription_failed")]
179 ShapeSubscriptionFailed { shape_id: String },
180
181 #[serde(rename = "storage")]
183 Storage {
184 component: String,
185 op: String,
186 detail: String,
187 },
188 #[serde(rename = "segment_corrupted")]
189 SegmentCorrupted {
190 segment_id: u64,
191 corruption: String,
192 detail: String,
193 },
194 #[serde(rename = "cold_storage")]
195 ColdStorage {
196 backend: String,
197 op: String,
198 detail: String,
199 },
200 #[serde(rename = "wal")]
201 Wal { stage: String, detail: String },
202
203 #[serde(rename = "serialization")]
205 Serialization { format: String },
206 #[serde(rename = "codec")]
207 Codec {
208 codec: String,
209 op: String,
210 detail: String,
211 },
212
213 #[serde(rename = "config")]
215 Config,
216 #[serde(rename = "bad_request")]
217 BadRequest,
218
219 #[serde(rename = "no_leader")]
221 NoLeader,
222 #[serde(rename = "not_leader")]
223 NotLeader { leader_addr: String },
224 #[serde(rename = "migration_in_progress")]
225 MigrationInProgress,
226 #[serde(rename = "node_unreachable")]
227 NodeUnreachable,
228 #[serde(rename = "cluster")]
229 Cluster,
230
231 #[serde(rename = "memory_exhausted")]
233 MemoryExhausted { engine: String },
234
235 #[serde(rename = "encryption")]
237 Encryption { cipher: String, detail: String },
238
239 #[serde(rename = "array")]
241 Array { array: String },
242
243 #[serde(rename = "quota_overcommit")]
245 QuotaOvercommit { field: String },
246 #[serde(rename = "quota_exceeded")]
247 QuotaExceeded { scope: String },
248 #[serde(rename = "server_overload")]
249 ServerOverload,
250
251 #[serde(rename = "clone_depth_exceeded")]
253 CloneDepthExceeded { depth: u32, limit: u32 },
254 #[serde(rename = "cannot_clone_mirror")]
255 CannotCloneMirror { database: String },
256 #[serde(rename = "clone_dependency")]
257 CloneDependency { dependents: Vec<String> },
258 #[serde(rename = "clone_predates_query_time")]
259 ClonePredatesQueryTime { as_of_lsn: u64, created_at_lsn: u64 },
260 #[serde(rename = "clone_write_requires_materialize")]
263 CloneWriteRequiresMaterialize {
264 collection: String,
265 engine: String,
266 database: String,
267 },
268
269 #[serde(rename = "backup_tenant_mismatch")]
272 BackupTenantMismatch { expected: u64, actual: u64 },
273 #[serde(rename = "backup_key_mismatch")]
275 BackupKeyMismatch,
276
277 #[serde(rename = "mirror_read_only")]
280 MirrorReadOnly { database: String },
281 #[serde(rename = "stale_read_not_leader")]
283 StaleReadNotLeader {
284 database: String,
285 source_cluster: String,
287 },
288 #[serde(rename = "mirror_not_promoted")]
290 MirrorNotPromoted { database: String },
291 #[serde(rename = "cannot_drop_default_database")]
293 CannotDropDefaultDatabase,
294
295 #[serde(rename = "move_tenant_drain_timeout")]
297 MoveTenantDrainTimeout { tenant: String, source_db: String },
298 #[serde(rename = "move_tenant_preflight_failed")]
299 MoveTenantPreflightFailed { tenant: String, detail: String },
300 #[serde(rename = "move_tenant_snapshot_failed")]
301 MoveTenantSnapshotFailed { tenant: String, detail: String },
302 #[serde(rename = "move_tenant_cutover_failed")]
303 MoveTenantCutoverFailed { tenant: String, detail: String },
304 #[serde(rename = "move_tenant_already_at_target")]
305 MoveTenantAlreadyAtTarget { tenant: String, target_db: String },
306
307 #[serde(rename = "bridge")]
309 Bridge {
310 plane: String,
311 op: String,
312 detail: String,
313 },
314 #[serde(rename = "dispatch")]
315 Dispatch { stage: String, detail: String },
316 #[serde(rename = "internal")]
317 Internal { component: String, detail: String },
318}