lib

Core libraries for Radroots
git clone https://radroots.dev/git/lib.git
Log | Files | Refs | README

error.rs (20869B)


      1 //! Stable, secret-safe storage failures.
      2 
      3 use core::fmt;
      4 
      5 /// Backend-neutral storage failure.
      6 #[non_exhaustive]
      7 #[derive(Clone, Debug, Eq, PartialEq)]
      8 pub enum Error {
      9     InvalidAuthoredOperation,
     10     InvalidAuthoredArtifact,
     11     InvalidAuthoredTransition,
     12     InvalidAuthoredDeliveryPlan,
     13     InvalidAuthoredDraft,
     14     DraftRevisionConflict,
     15     DraftNotFound,
     16     CorruptAuthoredDraft,
     17     DeliveryPlanClaimConflict,
     18     DeliveryAttemptOverflow,
     19     InvalidWorkClaim,
     20     InvalidWorkFailure,
     21     InvalidRetrySchedule,
     22     InvalidSourceGeneration,
     23     InvalidEventSequence,
     24     InvalidEventQueryLimit,
     25     EmptyEventQueryIds,
     26     TooManyEventQueryIds,
     27     DuplicateEventQueryId,
     28     AdmissionEventMismatch,
     29     AdmissionRegression,
     30     EventConflict,
     31     EventPageLimitExceeded,
     32     CursorGenerationMismatch,
     33     SourceGenerationChanged,
     34     EventNotFound,
     35     CorruptStoredEvent,
     36     BackendUnavailable,
     37     /// Capacity is exhausted; reconcile prior effects before retrying the same operation.
     38     SpaceInsufficient,
     39     InvalidOperationInstanceId,
     40     InvalidIdempotencyKey,
     41     InvalidOperationTimestamp,
     42     InvalidJournalRevision,
     43     InvalidRecoveryAttempt,
     44     InvalidRecoveryDeadline,
     45     InvalidJournalQueryLimit,
     46     IdempotencyConflict,
     47     OperationNotFound,
     48     OperationIdentityMismatch,
     49     JournalRevisionConflict,
     50     InvalidJournalTransition,
     51     JournalOperationCommitted,
     52     CorruptJournalRecord,
     53     InvalidOutboxItemId,
     54     InvalidOutboxRevision,
     55     InvalidOutboxTimestamp,
     56     InvalidOutboxLease,
     57     InvalidOutboxLeaseOwner,
     58     InvalidOutboxClaimLimit,
     59     InvalidDeliveryAttempt,
     60     InvalidDeliveryEvidence,
     61     OutboxItemNotFound,
     62     OutboxItemNotReady,
     63     OutboxItemTerminal,
     64     OutboxPlanConflict,
     65     OutboxLeaseConflict,
     66     OutboxLeaseExpired,
     67     OutboxRevisionConflict,
     68     CorruptOutboxRecord,
     69     InvalidProjectionId,
     70     InvalidProjectionGeneration,
     71     InvalidProjectionRevision,
     72     InvalidProjectionTimestamp,
     73     InvalidProjectionInvalidation,
     74     ProjectionCheckpointMismatch,
     75     ProjectionCheckpointRegression,
     76     ProjectionRevisionConflict,
     77     InvalidRebuildTicketId,
     78     InvalidRebuildTransition,
     79     RebuildTicketTerminal,
     80     InvalidEventIndexShardId,
     81     InvalidEventIndexRange,
     82     InvalidEventIndexArtifactPath,
     83     InvalidEventIndexShardCount,
     84     InvalidEventIndexTimestamp,
     85     InvalidEventIndexManifest,
     86     InvalidEventIndexCursor,
     87     InvalidEventIndexCheckpoint,
     88     DuplicateEventIndexShard,
     89     CorruptProjectionRecord,
     90     InvalidProjectionDocument,
     91     InvalidProjectionSnapshot,
     92     CorruptProjectionDocument,
     93     InvalidPrivateArtifactId,
     94     InvalidPrivateArtifactKind,
     95     InvalidPrivateArtifactSchema,
     96     InvalidPrivateArtifactSecretReference,
     97     InvalidPrivateArtifactRetention,
     98     InvalidPrivateArtifactRevision,
     99     InvalidPrivateArtifactResealId,
    100     InvalidPrivateArtifactResealRequest,
    101     InvalidPrivateArtifactTimestamp,
    102     InvalidPrivateArtifactMetadata,
    103     PrivateArtifactNotFound,
    104     PrivateArtifactConflict,
    105     PrivateArtifactRevisionConflict,
    106     PrivateArtifactResealConflict,
    107     PrivateArtifactPersistenceIndeterminate,
    108     PrivateArtifactRetentionActive,
    109     PrivateArtifactNotExpired,
    110     PrivateArtifactTombstoned,
    111     InvalidExpiredArtifactQueryLimit,
    112     CorruptPrivateArtifactMetadata,
    113     InvalidBackupId,
    114     InvalidBackupVersion,
    115     InvalidBackupTimestamp,
    116     InvalidBackupMemberPath,
    117     InvalidBackupMemberLength,
    118     InvalidBackupManifest,
    119     DuplicateBackupMember,
    120     BackupSecretPolicyViolation,
    121     BackupManifestPlanMismatch,
    122     InvalidBackupTransition,
    123     InvalidRestoreTimestamp,
    124     InvalidRestoreTransition,
    125     RestoreMemberVerificationFailed,
    126     InvalidReliabilityRevision,
    127     ReliabilityRevisionConflict,
    128     ReliabilityOperationTerminal,
    129     CorruptReliabilityOperation,
    130     InvalidIntegrityStatus,
    131     InvalidStorageStatus,
    132     InvalidAtomicCommitId,
    133     InvalidAtomicCommitTimestamp,
    134     AtomicCommitConflict,
    135     AtomicWorkflowMismatch,
    136     AtomicCommitFailed,
    137 }
    138 
    139 impl fmt::Display for Error {
    140     fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
    141         formatter.write_str(match self {
    142             Self::InvalidAuthoredOperation => "storage authored operation is invalid",
    143             Self::InvalidAuthoredArtifact => "storage authored artifact is invalid",
    144             Self::InvalidAuthoredTransition => "storage authored transition is invalid",
    145             Self::InvalidAuthoredDeliveryPlan => "storage authored delivery plan is invalid",
    146             Self::InvalidAuthoredDraft => "storage authored draft is invalid",
    147             Self::DraftRevisionConflict => "storage authored draft revision conflicts",
    148             Self::DraftNotFound => "storage authored draft was not found",
    149             Self::CorruptAuthoredDraft => "storage authored draft is corrupt",
    150             Self::DeliveryPlanClaimConflict => "storage delivery plan claim conflicts",
    151             Self::DeliveryAttemptOverflow => "storage delivery attempt counter overflowed",
    152             Self::InvalidWorkClaim => "storage authored work claim is invalid",
    153             Self::InvalidWorkFailure => "storage authored work failure is invalid",
    154             Self::InvalidRetrySchedule => "storage authored retry schedule is invalid",
    155             Self::InvalidSourceGeneration => "storage source generation is invalid",
    156             Self::InvalidEventSequence => "storage event sequence is invalid",
    157             Self::InvalidEventQueryLimit => "storage event query limit is invalid",
    158             Self::EmptyEventQueryIds => "storage event id query is empty",
    159             Self::TooManyEventQueryIds => "storage event id query exceeds its limit",
    160             Self::DuplicateEventQueryId => "storage event id query contains a duplicate",
    161             Self::AdmissionEventMismatch => "storage admission event identities do not match",
    162             Self::AdmissionRegression => "storage admission cannot regress event state",
    163             Self::EventConflict => "storage contains conflicting data for the event id",
    164             Self::EventPageLimitExceeded => "storage event page exceeds its requested limit",
    165             Self::CursorGenerationMismatch => "storage cursor belongs to another source generation",
    166             Self::SourceGenerationChanged => "storage source generation changed",
    167             Self::EventNotFound => "storage event was not found",
    168             Self::CorruptStoredEvent => "storage event data is corrupt",
    169             Self::BackendUnavailable => "storage backend is unavailable",
    170             Self::SpaceInsufficient => "storage space is insufficient",
    171             Self::InvalidOperationInstanceId => "storage operation instance id is invalid",
    172             Self::InvalidIdempotencyKey => "storage idempotency key is invalid",
    173             Self::InvalidOperationTimestamp => "storage operation timestamp is invalid",
    174             Self::InvalidJournalRevision => "storage journal revision is invalid",
    175             Self::InvalidRecoveryAttempt => "storage recovery attempt is invalid",
    176             Self::InvalidRecoveryDeadline => "storage recovery deadline is invalid",
    177             Self::InvalidJournalQueryLimit => "storage journal query limit is invalid",
    178             Self::IdempotencyConflict => "storage idempotency key conflicts with prior input",
    179             Self::OperationNotFound => "storage journal operation was not found",
    180             Self::OperationIdentityMismatch => "storage journal operation identity does not match",
    181             Self::JournalRevisionConflict => {
    182                 "storage journal revision conflicts with durable state"
    183             }
    184             Self::InvalidJournalTransition => "storage journal transition is invalid",
    185             Self::JournalOperationCommitted => "storage journal operation is already committed",
    186             Self::CorruptJournalRecord => "storage journal record is corrupt",
    187             Self::InvalidOutboxItemId => "storage outbox item id is invalid",
    188             Self::InvalidOutboxRevision => "storage outbox revision is invalid",
    189             Self::InvalidOutboxTimestamp => "storage outbox timestamp is invalid",
    190             Self::InvalidOutboxLease => "storage outbox lease is invalid",
    191             Self::InvalidOutboxLeaseOwner => "storage outbox lease owner is invalid",
    192             Self::InvalidOutboxClaimLimit => "storage outbox claim limit is invalid",
    193             Self::InvalidDeliveryAttempt => "storage delivery attempt is invalid",
    194             Self::InvalidDeliveryEvidence => "storage delivery evidence is invalid",
    195             Self::OutboxItemNotFound => "storage outbox item was not found",
    196             Self::OutboxItemNotReady => "storage outbox item is not ready",
    197             Self::OutboxItemTerminal => "storage outbox item is terminal",
    198             Self::OutboxPlanConflict => "storage outbox plan conflicts with durable state",
    199             Self::OutboxLeaseConflict => "storage outbox lease conflicts with durable state",
    200             Self::OutboxLeaseExpired => "storage outbox lease expired",
    201             Self::OutboxRevisionConflict => "storage outbox revision conflicts with durable state",
    202             Self::CorruptOutboxRecord => "storage outbox record is corrupt",
    203             Self::InvalidProjectionId => "storage projection id is invalid",
    204             Self::InvalidProjectionGeneration => "storage projection generation is invalid",
    205             Self::InvalidProjectionRevision => "storage projection revision is invalid",
    206             Self::InvalidProjectionTimestamp => "storage projection timestamp is invalid",
    207             Self::InvalidProjectionInvalidation => "storage projection invalidation is invalid",
    208             Self::ProjectionCheckpointMismatch => {
    209                 "storage projection checkpoint identity does not match"
    210             }
    211             Self::ProjectionCheckpointRegression => "storage projection checkpoint regressed",
    212             Self::ProjectionRevisionConflict => {
    213                 "storage projection revision conflicts with durable state"
    214             }
    215             Self::InvalidRebuildTicketId => "storage projection rebuild ticket id is invalid",
    216             Self::InvalidRebuildTransition => "storage projection rebuild transition is invalid",
    217             Self::RebuildTicketTerminal => "storage projection rebuild ticket is terminal",
    218             Self::InvalidEventIndexShardId => "storage event-index shard id is invalid",
    219             Self::InvalidEventIndexRange => "storage event-index id range is invalid",
    220             Self::InvalidEventIndexArtifactPath => "storage event-index artifact path is invalid",
    221             Self::InvalidEventIndexShardCount => "storage event-index shard count is invalid",
    222             Self::InvalidEventIndexTimestamp => "storage event-index timestamp is invalid",
    223             Self::InvalidEventIndexManifest => "storage event-index manifest is invalid",
    224             Self::InvalidEventIndexCursor => "storage event-index cursor is invalid",
    225             Self::InvalidEventIndexCheckpoint => "storage event-index checkpoint is invalid",
    226             Self::DuplicateEventIndexShard => "storage event-index shard is duplicated",
    227             Self::CorruptProjectionRecord => "storage projection record is corrupt",
    228             Self::InvalidProjectionDocument => "storage projection document is invalid",
    229             Self::InvalidProjectionSnapshot => "storage projection snapshot is invalid",
    230             Self::CorruptProjectionDocument => "storage projection document is corrupt",
    231             Self::InvalidPrivateArtifactId => "storage private-artifact id is invalid",
    232             Self::InvalidPrivateArtifactKind => "storage private-artifact kind is invalid",
    233             Self::InvalidPrivateArtifactSchema => "storage private-artifact schema is invalid",
    234             Self::InvalidPrivateArtifactSecretReference => {
    235                 "storage private-artifact secret reference is invalid"
    236             }
    237             Self::InvalidPrivateArtifactRetention => {
    238                 "storage private-artifact retention is invalid"
    239             }
    240             Self::InvalidPrivateArtifactRevision => "storage private-artifact revision is invalid",
    241             Self::InvalidPrivateArtifactResealId => "storage private-artifact reseal id is invalid",
    242             Self::InvalidPrivateArtifactResealRequest => {
    243                 "storage private-artifact reseal request is invalid"
    244             }
    245             Self::InvalidPrivateArtifactTimestamp => {
    246                 "storage private-artifact timestamp is invalid"
    247             }
    248             Self::InvalidPrivateArtifactMetadata => "storage private-artifact metadata is invalid",
    249             Self::PrivateArtifactNotFound => "storage private artifact was not found",
    250             Self::PrivateArtifactConflict => {
    251                 "storage private-artifact metadata conflicts with durable state"
    252             }
    253             Self::PrivateArtifactRevisionConflict => {
    254                 "storage private-artifact revision conflicts with durable state"
    255             }
    256             Self::PrivateArtifactResealConflict => {
    257                 "storage private-artifact reseal conflicts with durable state"
    258             }
    259             Self::PrivateArtifactPersistenceIndeterminate => {
    260                 "storage private-artifact persistence outcome is indeterminate"
    261             }
    262             Self::PrivateArtifactRetentionActive => "storage private-artifact retention is active",
    263             Self::PrivateArtifactNotExpired => "storage private artifact has not expired",
    264             Self::PrivateArtifactTombstoned => "storage private artifact is tombstoned",
    265             Self::InvalidExpiredArtifactQueryLimit => {
    266                 "storage expired-artifact query limit is invalid"
    267             }
    268             Self::CorruptPrivateArtifactMetadata => "storage private-artifact metadata is corrupt",
    269             Self::InvalidBackupId => "storage backup id is invalid",
    270             Self::InvalidBackupVersion => "storage backup version is invalid",
    271             Self::InvalidBackupTimestamp => "storage backup timestamp is invalid",
    272             Self::InvalidBackupMemberPath => "storage backup member path is invalid",
    273             Self::InvalidBackupMemberLength => "storage backup member length is invalid",
    274             Self::InvalidBackupManifest => "storage backup manifest is invalid",
    275             Self::DuplicateBackupMember => "storage backup member is duplicated",
    276             Self::BackupSecretPolicyViolation => "storage backup secret policy was violated",
    277             Self::BackupManifestPlanMismatch => "storage backup manifest does not match its plan",
    278             Self::InvalidBackupTransition => "storage backup transition is invalid",
    279             Self::InvalidRestoreTimestamp => "storage restore timestamp is invalid",
    280             Self::InvalidRestoreTransition => "storage restore transition is invalid",
    281             Self::RestoreMemberVerificationFailed => "storage restore member verification failed",
    282             Self::InvalidReliabilityRevision => "storage reliability revision is invalid",
    283             Self::ReliabilityRevisionConflict => {
    284                 "storage reliability revision conflicts with durable state"
    285             }
    286             Self::ReliabilityOperationTerminal => "storage reliability operation is terminal",
    287             Self::CorruptReliabilityOperation => "storage reliability operation is corrupt",
    288             Self::InvalidIntegrityStatus => "storage integrity status is invalid",
    289             Self::InvalidStorageStatus => "storage status is invalid",
    290             Self::InvalidAtomicCommitId => "storage atomic commit id is invalid",
    291             Self::InvalidAtomicCommitTimestamp => "storage atomic commit timestamp is invalid",
    292             Self::AtomicCommitConflict => "storage atomic commit conflicts with durable state",
    293             Self::AtomicWorkflowMismatch => "storage atomic workflow components do not match",
    294             Self::AtomicCommitFailed => "storage atomic workflow did not commit",
    295         })
    296     }
    297 }
    298 
    299 impl std::error::Error for Error {}
    300 
    301 #[cfg(test)]
    302 mod tests {
    303     use super::Error::*;
    304 
    305     #[test]
    306     fn every_storage_error_has_a_stable_nonempty_message() {
    307         let errors = [
    308             InvalidAuthoredOperation,
    309             InvalidAuthoredArtifact,
    310             InvalidAuthoredTransition,
    311             InvalidAuthoredDeliveryPlan,
    312             DeliveryPlanClaimConflict,
    313             DeliveryAttemptOverflow,
    314             InvalidWorkClaim,
    315             InvalidWorkFailure,
    316             InvalidRetrySchedule,
    317             InvalidSourceGeneration,
    318             InvalidEventSequence,
    319             InvalidEventQueryLimit,
    320             EmptyEventQueryIds,
    321             TooManyEventQueryIds,
    322             DuplicateEventQueryId,
    323             AdmissionEventMismatch,
    324             AdmissionRegression,
    325             EventConflict,
    326             EventPageLimitExceeded,
    327             CursorGenerationMismatch,
    328             SourceGenerationChanged,
    329             EventNotFound,
    330             CorruptStoredEvent,
    331             BackendUnavailable,
    332             SpaceInsufficient,
    333             InvalidOperationInstanceId,
    334             InvalidIdempotencyKey,
    335             InvalidOperationTimestamp,
    336             InvalidJournalRevision,
    337             InvalidRecoveryAttempt,
    338             InvalidRecoveryDeadline,
    339             InvalidJournalQueryLimit,
    340             IdempotencyConflict,
    341             OperationNotFound,
    342             OperationIdentityMismatch,
    343             JournalRevisionConflict,
    344             InvalidJournalTransition,
    345             JournalOperationCommitted,
    346             CorruptJournalRecord,
    347             InvalidOutboxItemId,
    348             InvalidOutboxRevision,
    349             InvalidOutboxTimestamp,
    350             InvalidOutboxLease,
    351             InvalidOutboxLeaseOwner,
    352             InvalidOutboxClaimLimit,
    353             InvalidDeliveryAttempt,
    354             InvalidDeliveryEvidence,
    355             OutboxItemNotFound,
    356             OutboxItemNotReady,
    357             OutboxItemTerminal,
    358             OutboxPlanConflict,
    359             OutboxLeaseConflict,
    360             OutboxLeaseExpired,
    361             OutboxRevisionConflict,
    362             CorruptOutboxRecord,
    363             InvalidProjectionId,
    364             InvalidProjectionGeneration,
    365             InvalidProjectionRevision,
    366             InvalidProjectionTimestamp,
    367             InvalidProjectionInvalidation,
    368             ProjectionCheckpointMismatch,
    369             ProjectionCheckpointRegression,
    370             ProjectionRevisionConflict,
    371             InvalidRebuildTicketId,
    372             InvalidRebuildTransition,
    373             RebuildTicketTerminal,
    374             InvalidEventIndexShardId,
    375             InvalidEventIndexRange,
    376             InvalidEventIndexArtifactPath,
    377             InvalidEventIndexShardCount,
    378             InvalidEventIndexTimestamp,
    379             InvalidEventIndexManifest,
    380             InvalidEventIndexCursor,
    381             InvalidEventIndexCheckpoint,
    382             DuplicateEventIndexShard,
    383             CorruptProjectionRecord,
    384             InvalidProjectionDocument,
    385             InvalidProjectionSnapshot,
    386             CorruptProjectionDocument,
    387             InvalidPrivateArtifactId,
    388             InvalidPrivateArtifactKind,
    389             InvalidPrivateArtifactSchema,
    390             InvalidPrivateArtifactSecretReference,
    391             InvalidPrivateArtifactRetention,
    392             InvalidPrivateArtifactRevision,
    393             InvalidPrivateArtifactResealId,
    394             InvalidPrivateArtifactResealRequest,
    395             InvalidPrivateArtifactTimestamp,
    396             InvalidPrivateArtifactMetadata,
    397             PrivateArtifactNotFound,
    398             PrivateArtifactConflict,
    399             PrivateArtifactRevisionConflict,
    400             PrivateArtifactResealConflict,
    401             PrivateArtifactPersistenceIndeterminate,
    402             PrivateArtifactRetentionActive,
    403             PrivateArtifactNotExpired,
    404             PrivateArtifactTombstoned,
    405             InvalidExpiredArtifactQueryLimit,
    406             CorruptPrivateArtifactMetadata,
    407             InvalidBackupId,
    408             InvalidBackupVersion,
    409             InvalidBackupTimestamp,
    410             InvalidBackupMemberPath,
    411             InvalidBackupMemberLength,
    412             InvalidBackupManifest,
    413             DuplicateBackupMember,
    414             BackupSecretPolicyViolation,
    415             BackupManifestPlanMismatch,
    416             InvalidBackupTransition,
    417             InvalidRestoreTimestamp,
    418             InvalidRestoreTransition,
    419             RestoreMemberVerificationFailed,
    420             InvalidReliabilityRevision,
    421             ReliabilityRevisionConflict,
    422             ReliabilityOperationTerminal,
    423             CorruptReliabilityOperation,
    424             InvalidIntegrityStatus,
    425             InvalidStorageStatus,
    426             InvalidAtomicCommitId,
    427             InvalidAtomicCommitTimestamp,
    428             AtomicCommitConflict,
    429             AtomicWorkflowMismatch,
    430             AtomicCommitFailed,
    431         ];
    432         for error in errors {
    433             assert!(!error.to_string().is_empty());
    434         }
    435     }
    436 }