cipherstash_dynamodb/errors/
mod.rs

1use aws_sdk_dynamodb::{error::SdkError, operation};
2use miette::Diagnostic;
3use thiserror::Error;
4
5use crate::traits::PrimaryKeyError;
6pub use crate::{
7    crypto::{CryptoError, SealError},
8    traits::{ReadConversionError, WriteConversionError},
9};
10
11pub use cipherstash_client::{
12    config::errors::ConfigError, encryption::EncryptionError, zerokms::Error as ZeroKmsError,
13};
14
15pub use aws_sdk_dynamodb::error::BuildError;
16
17/// Error returned by `EncryptedTable::put` when indexing, encrypting and inserting records into DynamoDB
18#[derive(Error, Debug, Diagnostic)]
19pub enum PutError {
20    #[error("PrimaryKeyError: {0}")]
21    PrimaryKeyError(#[from] PrimaryKeyError),
22    // TODO: Get rid of this, too?
23    #[error("AwsBuildError: {0}")]
24    AwsBuildError(#[from] BuildError),
25    #[error("Write Conversion Error: {0}")]
26    WriteConversion(#[from] WriteConversionError),
27    #[error("SealError: {0}")]
28    Seal(#[from] SealError),
29    #[error("CryptoError: {0}")]
30    Crypto(#[from] CryptoError),
31    #[error("Encryption Error: {0}")]
32    Encryption(#[from] EncryptionError),
33
34    #[error(transparent)]
35    DynamoError(#[from] SdkError<operation::transact_write_items::TransactWriteItemsError>),
36}
37
38/// Error returned by `EncryptedTable::get` when retrieving and decrypting records from DynamoDB
39#[derive(Error, Debug, Diagnostic)]
40pub enum GetError {
41    #[error(transparent)]
42    PrimaryKeyError(#[from] PrimaryKeyError),
43    #[error(transparent)]
44    DecryptError(#[from] DecryptError),
45    #[error(transparent)]
46    Encryption(#[from] EncryptionError),
47    #[error("AwsError: {0}")]
48    Aws(String),
49}
50
51/// Error returned by `EncryptedTable::delete` when indexing and deleting records in DynamoDB
52#[derive(Error, Debug, Diagnostic)]
53pub enum DeleteError {
54    #[error("PrimaryKeyError: {0}")]
55    PrimaryKeyError(#[from] PrimaryKeyError),
56    #[error("Encryption Error: {0}")]
57    Encryption(#[from] EncryptionError),
58    #[error("AwsBuildError: {0}")]
59    AwsBuildError(#[from] BuildError),
60    #[error("AwsError: {0}")]
61    Aws(String),
62}
63
64/// Error returned by `EncryptedTable::query` when indexing, retrieving and decrypting records from DynamoDB
65#[derive(Error, Debug, Diagnostic)]
66pub enum DecryptError {
67    #[error("ReadConversionError: {0}")]
68    ReadConversionError(#[from] ReadConversionError),
69    #[error("SealError: {0}")]
70    SealError(#[from] SealError),
71}
72
73/// Error returned by [`crate::EncryptedTable::query`] when indexing, retrieving and decrypting records from DynamoDB
74#[derive(Error, Debug, Diagnostic)]
75pub enum QueryError {
76    #[error("PrimaryKeyError: {0}")]
77    PrimaryKeyError(#[from] PrimaryKeyError),
78    #[error("InvaldQuery: {0}")]
79    InvalidQuery(String),
80    #[error("CryptoError: {0}")]
81    CryptoError(#[from] CryptoError),
82    #[error("EncryptionError: {0}")]
83    EncryptionError(#[from] EncryptionError),
84    #[error("Decrypt Error: {0}")]
85    DecryptError(#[from] DecryptError),
86    #[error("{0}")]
87    Other(String),
88
89    #[error(transparent)]
90    DynamoError(#[from] SdkError<operation::query::QueryError>),
91}
92
93pub trait DynamoError: std::error::Error + Sized {}
94
95/// Error returned by `EncryptedTable::init` when connecting to CipherStash services
96#[derive(Error, Debug, Diagnostic)]
97pub enum InitError {
98    #[error("ConfigError: {0}")]
99    Config(#[from] ConfigError),
100    #[error(transparent)]
101    ZeroKmsError(#[from] ZeroKmsError),
102}
103
104/// The [`enum@Error`] type abstracts all errors returned by `cipherstash-dynamodb` for easy use with the `?` operator.
105#[derive(Error, Debug, Diagnostic)]
106pub enum Error {
107    #[error("InitError: {0}")]
108    InitError(#[from] InitError),
109    #[error("PutError: {0}")]
110    PutError(#[from] PutError),
111    #[error("GetError: {0}")]
112    GetError(#[from] GetError),
113    #[error("DeleteError: {0}")]
114    DeleteError(#[from] DeleteError),
115    #[error(transparent)]
116    QueryError(#[from] QueryError),
117}