From 1aecde2896c869565a453719969e0b1170b8da02 Mon Sep 17 00:00:00 2001 From: Denis Kolodin Date: Mon, 11 Oct 2021 15:57:01 +0300 Subject: [PATCH] fix: add special CompletedTransactionConversionError type --- .../wallet/src/transaction_service/error.rs | 4 ++- .../transaction_service/storage/sqlite_db.rs | 30 +++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/base_layer/wallet/src/transaction_service/error.rs b/base_layer/wallet/src/transaction_service/error.rs index cbc828d2ba..6eac17cfac 100644 --- a/base_layer/wallet/src/transaction_service/error.rs +++ b/base_layer/wallet/src/transaction_service/error.rs @@ -23,7 +23,7 @@ use crate::{ error::WalletStorageError, output_manager_service::error::OutputManagerError, - transaction_service::storage::database::DbKey, + transaction_service::storage::{database::DbKey, sqlite_db::CompletedTransactionConversionError}, }; use diesel::result::Error as DieselError; use futures::channel::oneshot::Canceled; @@ -190,6 +190,8 @@ pub enum TransactionStorageError { OutOfRangeError(#[from] OutOfRangeError), #[error("Error converting a type: `{0}`")] ConversionError(#[from] TransactionConversionError), + #[error("Completed transaction conversion error: `{0}`")] + CompletedConversionError(#[from] CompletedTransactionConversionError), #[error("Serde json error: `{0}`")] SerdeJsonError(#[from] SerdeJsonError), #[error("R2d2 error")] diff --git a/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs b/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs index ba0ac46747..83c30f0c04 100644 --- a/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs +++ b/base_layer/wallet/src/transaction_service/storage/sqlite_db.rs @@ -46,7 +46,13 @@ use std::{ sync::{Arc, MutexGuard, RwLock}, }; use tari_common_types::{ - transaction::{TransactionDirection, TransactionStatus, TxId}, + transaction::{ + TransactionConversionError, + TransactionDirection, + TransactionDirectionError, + TransactionStatus, + TxId, + }, types::{BlockHash, PublicKey}, }; use tari_comms::types::CommsPublicKey; @@ -55,6 +61,7 @@ use tari_crypto::tari_utilities::{ hex::{from_hex, Hex}, ByteArray, }; +use thiserror::Error; use tokio::time::Instant; const LOG_TARGET: &str = "wallet::transaction_service::database::sqlite_db"; @@ -871,13 +878,7 @@ impl TransactionBackend for TransactionServiceSqliteDatabase { let mut coinbase_txs = CompletedTransactionSql::index_coinbase_at_block_height(block_height as i64, &conn)?; for c in coinbase_txs.iter_mut() { self.decrypt_if_necessary(c)?; - // TODO: WARNING! The change hides the intermediate error! - // Use `CompletedTransactionConversionError` ASAP!!! let completed_tx = CompletedTransaction::try_from(c.clone())?; - // .map_err(|_| { - // TransactionStorageError::ConversionError("Error converting to CompletedTransaction".to_string()) - // })?; - if completed_tx.amount == amount { return Ok(Some(completed_tx)); } @@ -1640,9 +1641,20 @@ impl TryFrom for CompletedTransactionSql { } } +#[derive(Debug, Error)] +pub enum CompletedTransactionConversionError { + #[error("CompletedTransaction conversion failed by wrong direction: {0}")] + DirectionError(#[from] TransactionDirectionError), + #[error("CompletedTransaction conversion failed with transaction conversion: {0}")] + ConversionError(#[from] TransactionConversionError), + #[error("CompletedTransaction conversion failed with json error: {0}")] + JsonError(#[from] serde_json::Error), + #[error("CompletedTransaction conversion failed with key error: {0}")] + KeyError(#[from] TransactionKeyError), +} + impl TryFrom for CompletedTransaction { - // TODO: Add `CompletedTransactionConversionError` instead - type Error = TransactionStorageError; + type Error = CompletedTransactionConversionError; fn try_from(c: CompletedTransactionSql) -> Result { Ok(Self {