use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
#[non_exhaustive]
pub enum ErrorDetails {
#[serde(rename = "constraint_violation")]
ConstraintViolation {
collection: String,
constraint: String,
},
#[serde(rename = "write_conflict")]
WriteConflict {
collection: String,
document_id: String,
},
#[serde(rename = "deadline_exceeded")]
DeadlineExceeded,
#[serde(rename = "prevalidation_rejected")]
PrevalidationRejected { constraint: String },
#[serde(rename = "append_only_violation")]
AppendOnlyViolation { collection: String },
#[serde(rename = "balance_violation")]
BalanceViolation { collection: String },
#[serde(rename = "period_locked")]
PeriodLocked { collection: String },
#[serde(rename = "period_lock_misconfigured")]
PeriodLockMisconfigured {
collection: String,
ref_table: String,
status_column: String,
},
#[serde(rename = "state_transition_violation")]
StateTransitionViolation { collection: String },
#[serde(rename = "transition_check_violation")]
TransitionCheckViolation { collection: String },
#[serde(rename = "type_guard_violation")]
TypeGuardViolation { collection: String },
#[serde(rename = "retention_violation")]
RetentionViolation { collection: String },
#[serde(rename = "legal_hold_active")]
LegalHoldActive { collection: String },
#[serde(rename = "type_mismatch")]
TypeMismatch { collection: String },
#[serde(rename = "overflow")]
Overflow { collection: String },
#[serde(rename = "insufficient_balance")]
InsufficientBalance { collection: String },
#[serde(rename = "rate_exceeded")]
RateExceeded { gate: String },
#[serde(rename = "transaction_rollback")]
TransactionRollback { detail: String },
#[serde(rename = "active_sql_transaction")]
ActiveSqlTransaction { detail: String },
#[serde(rename = "collection_not_found")]
CollectionNotFound { collection: String },
#[serde(rename = "database_not_found")]
DatabaseNotFound { database: String },
#[serde(rename = "document_not_found")]
DocumentNotFound {
collection: String,
document_id: String,
},
#[serde(rename = "undefined_object")]
UndefinedObject { object: String },
#[serde(rename = "already_exists")]
AlreadyExists { object: String },
#[serde(rename = "object_not_ready")]
ObjectNotReady { object: String },
#[serde(rename = "not_found")]
NotFound { detail: String },
#[serde(rename = "dependent_objects_exist")]
DependentObjectsExist { object: String },
#[serde(rename = "collection_draining")]
CollectionDraining { collection: String },
#[serde(rename = "collection_deactivated")]
CollectionDeactivated {
collection: String,
retention_expires_at_ns: u64,
undrop_hint: String,
},
#[serde(rename = "plan_error")]
PlanError { phase: String, detail: String },
#[serde(rename = "sql_not_enabled")]
SqlNotEnabled,
#[serde(rename = "undefined_function")]
UndefinedFunction { name: String },
#[serde(rename = "undefined_column")]
UndefinedColumn { column: String },
#[serde(rename = "ambiguous_column")]
AmbiguousColumn { column: String },
#[serde(rename = "division_by_zero")]
DivisionByZero,
#[serde(rename = "data_exception")]
DataException { detail: String },
#[serde(rename = "program_limit_exceeded")]
ProgramLimitExceeded { detail: String },
#[serde(rename = "invalid_limit_value")]
InvalidLimitValue { clause: String, value: String },
#[serde(rename = "authorization_denied")]
AuthorizationDenied { resource: String },
#[serde(rename = "auth_expired")]
AuthExpired,
#[serde(rename = "authentication_failed")]
AuthenticationFailed,
#[serde(rename = "tenant_vector_dim_exceeded")]
TenantVectorDimExceeded { dim: u32, limit: u32 },
#[serde(rename = "tenant_graph_depth_exceeded")]
TenantGraphDepthExceeded { depth: u32, limit: u32 },
#[serde(rename = "handshake_failed")]
HandshakeFailed {
server_code: u8,
},
#[serde(rename = "sync_connection_failed")]
SyncConnectionFailed,
#[serde(rename = "sync_delta_rejected")]
SyncDeltaRejected {
compensation: Option<crate::sync::compensation::CompensationHint>,
},
#[serde(rename = "shape_subscription_failed")]
ShapeSubscriptionFailed { shape_id: String },
#[serde(rename = "storage")]
Storage {
component: String,
op: String,
detail: String,
},
#[serde(rename = "segment_corrupted")]
SegmentCorrupted {
segment_id: u64,
corruption: String,
detail: String,
},
#[serde(rename = "cold_storage")]
ColdStorage {
backend: String,
op: String,
detail: String,
},
#[serde(rename = "wal")]
Wal { stage: String, detail: String },
#[serde(rename = "serialization")]
Serialization { format: String },
#[serde(rename = "codec")]
Codec {
codec: String,
op: String,
detail: String,
},
#[serde(rename = "config")]
Config,
#[serde(rename = "bad_request")]
BadRequest,
#[serde(rename = "no_leader")]
NoLeader,
#[serde(rename = "not_leader")]
NotLeader { leader_addr: String },
#[serde(rename = "migration_in_progress")]
MigrationInProgress,
#[serde(rename = "node_unreachable")]
NodeUnreachable,
#[serde(rename = "cluster")]
Cluster,
#[serde(rename = "memory_exhausted")]
MemoryExhausted { engine: String },
#[serde(rename = "encryption")]
Encryption { cipher: String, detail: String },
#[serde(rename = "array")]
Array { array: String },
#[serde(rename = "quota_overcommit")]
QuotaOvercommit { field: String },
#[serde(rename = "quota_exceeded")]
QuotaExceeded { scope: String },
#[serde(rename = "server_overload")]
ServerOverload,
#[serde(rename = "clone_depth_exceeded")]
CloneDepthExceeded { depth: u32, limit: u32 },
#[serde(rename = "cannot_clone_mirror")]
CannotCloneMirror { database: String },
#[serde(rename = "clone_dependency")]
CloneDependency { dependents: Vec<String> },
#[serde(rename = "clone_predates_query_time")]
ClonePredatesQueryTime { as_of_lsn: u64, created_at_lsn: u64 },
#[serde(rename = "clone_write_requires_materialize")]
CloneWriteRequiresMaterialize {
collection: String,
engine: String,
database: String,
},
#[serde(rename = "backup_tenant_mismatch")]
BackupTenantMismatch { expected: u64, actual: u64 },
#[serde(rename = "backup_key_mismatch")]
BackupKeyMismatch,
#[serde(rename = "mirror_read_only")]
MirrorReadOnly { database: String },
#[serde(rename = "stale_read_not_leader")]
StaleReadNotLeader {
database: String,
source_cluster: String,
},
#[serde(rename = "mirror_not_promoted")]
MirrorNotPromoted { database: String },
#[serde(rename = "cannot_drop_default_database")]
CannotDropDefaultDatabase,
#[serde(rename = "move_tenant_drain_timeout")]
MoveTenantDrainTimeout { tenant: String, source_db: String },
#[serde(rename = "move_tenant_preflight_failed")]
MoveTenantPreflightFailed { tenant: String, detail: String },
#[serde(rename = "move_tenant_snapshot_failed")]
MoveTenantSnapshotFailed { tenant: String, detail: String },
#[serde(rename = "move_tenant_cutover_failed")]
MoveTenantCutoverFailed { tenant: String, detail: String },
#[serde(rename = "move_tenant_already_at_target")]
MoveTenantAlreadyAtTarget { tenant: String, target_db: String },
#[serde(rename = "bridge")]
Bridge {
plane: String,
op: String,
detail: String,
},
#[serde(rename = "dispatch")]
Dispatch { stage: String, detail: String },
#[serde(rename = "internal")]
Internal { component: String, detail: String },
}