Skip to content

Commit 9259c2f

Browse files
refactor: delegate empty checking to store receipts functions
1 parent 9ba8308 commit 9259c2f

File tree

1 file changed

+36
-37
lines changed

1 file changed

+36
-37
lines changed

crates/service/src/tap/receipt_store.rs

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ enum ProcessReceiptError {
3030
/// Indicates which versions of Receipts where processed
3131
/// It's intended to be used for migration tests
3232
#[derive(Debug, PartialEq, Eq)]
33-
pub enum Processed {
33+
pub enum ProcessedReceipt {
3434
V1,
3535
V2,
3636
Both,
@@ -41,40 +41,35 @@ impl InnerContext {
4141
async fn process_db_receipts(
4242
&self,
4343
buffer: Vec<DatabaseReceipt>,
44-
) -> Result<Processed, ProcessReceiptError> {
44+
) -> Result<ProcessedReceipt, ProcessReceiptError> {
4545
let (v1_receipts, v2_receipts): (Vec<_>, Vec<_>) =
4646
buffer.into_iter().partition_map(|r| match r {
4747
DatabaseReceipt::V1(db_receipt_v1) => Either::Left(db_receipt_v1),
4848
DatabaseReceipt::V2(db_receipt_v2) => Either::Right(db_receipt_v2),
4949
});
5050

51-
let (insert_v1, insert_v2) = match (v1_receipts.is_empty(), v2_receipts.is_empty()) {
52-
(true, true) => (None, None),
53-
(false, true) => (Some(self.store_receipts_v1(v1_receipts).await), None),
54-
(true, false) => (None, Some(self.store_receipts_v2(v2_receipts).await)),
55-
(false, false) => {
56-
let (v1, v2) = tokio::join!(
57-
self.store_receipts_v1(v1_receipts),
58-
self.store_receipts_v2(v2_receipts),
59-
);
60-
(Some(v1), Some(v2))
61-
}
62-
};
51+
let (insert_v1, insert_v2) = tokio::join!(
52+
self.store_receipts_v1(v1_receipts),
53+
self.store_receipts_v2(v2_receipts),
54+
);
6355

6456
match (insert_v1, insert_v2) {
65-
(Some(Err(e1)), Some(Err(e2))) => Err(ProcessReceiptError::Both(e1.into(), e2.into())),
66-
(Some(Err(e1)), _) => Err(ProcessReceiptError::V1(e1.into())),
67-
(_, Some(Err(e2))) => Err(ProcessReceiptError::V2(e2.into())),
68-
69-
// only useful for testing
70-
(Some(Ok(_)), None) => Ok(Processed::V1),
71-
(None, Some(Ok(_))) => Ok(Processed::V2),
72-
(Some(Ok(_)), Some(Ok(_))) => Ok(Processed::Both),
73-
(None, None) => Ok(Processed::None),
57+
(Err(e1), Err(e2)) => Err(ProcessReceiptError::Both(e1.into(), e2.into())),
58+
59+
(Err(e1), Ok(_)) => Err(ProcessReceiptError::V1(e1.into())),
60+
(Ok(_), Err(e2)) => Err(ProcessReceiptError::V2(e2.into())),
61+
62+
(Ok(0), Ok(0)) => Ok(ProcessedReceipt::None),
63+
(Ok(_), Ok(0)) => Ok(ProcessedReceipt::V1),
64+
(Ok(0), Ok(_)) => Ok(ProcessedReceipt::V2),
65+
(Ok(_), Ok(_)) => Ok(ProcessedReceipt::Both),
7466
}
7567
}
7668

77-
async fn store_receipts_v1(&self, receipts: Vec<DbReceiptV1>) -> Result<(), AdapterError> {
69+
async fn store_receipts_v1(&self, receipts: Vec<DbReceiptV1>) -> Result<u64, AdapterError> {
70+
if receipts.is_empty() {
71+
return Ok(0);
72+
}
7873
let receipts_len = receipts.len();
7974
let mut signers = Vec::with_capacity(receipts_len);
8075
let mut signatures = Vec::with_capacity(receipts_len);
@@ -91,7 +86,7 @@ impl InnerContext {
9186
nonces.push(receipt.nonce);
9287
values.push(receipt.value);
9388
}
94-
sqlx::query!(
89+
let query_res = sqlx::query!(
9590
r#"INSERT INTO scalar_tap_receipts (
9691
signer_address,
9792
signature,
@@ -121,10 +116,13 @@ impl InnerContext {
121116
anyhow!(e)
122117
})?;
123118

124-
Ok(())
119+
Ok(query_res.rows_affected())
125120
}
126121

127-
async fn store_receipts_v2(&self, receipts: Vec<DbReceiptV2>) -> Result<(), AdapterError> {
122+
async fn store_receipts_v2(&self, receipts: Vec<DbReceiptV2>) -> Result<u64, AdapterError> {
123+
if receipts.is_empty() {
124+
return Ok(0);
125+
}
128126
let receipts_len = receipts.len();
129127
let mut signers = Vec::with_capacity(receipts_len);
130128
let mut signatures = Vec::with_capacity(receipts_len);
@@ -147,7 +145,7 @@ impl InnerContext {
147145
nonces.push(receipt.nonce);
148146
values.push(receipt.value);
149147
}
150-
sqlx::query!(
148+
let query_res = sqlx::query!(
151149
r#"INSERT INTO tap_horizon_receipts (
152150
signer_address,
153151
signature,
@@ -186,7 +184,7 @@ impl InnerContext {
186184
anyhow!(e)
187185
})?;
188186

189-
Ok(())
187+
Ok(query_res.rows_affected())
190188
}
191189
}
192190

@@ -347,7 +345,8 @@ mod tests {
347345

348346
use crate::tap::{
349347
receipt_store::{
350-
DatabaseReceipt, DbReceiptV1, DbReceiptV2, InnerContext, ProcessReceiptError, Processed,
348+
DatabaseReceipt, DbReceiptV1, DbReceiptV2, InnerContext, ProcessReceiptError,
349+
ProcessedReceipt,
351350
},
352351
AdapterError,
353352
};
@@ -373,14 +372,14 @@ mod tests {
373372
use super::*;
374373

375374
#[rstest::rstest]
376-
#[case(Processed::None, async { vec![] })]
377-
#[case(Processed::V1, async { vec![create_v1().await] })]
378-
#[case(Processed::V2, async { vec![create_v2().await] })]
379-
#[case(Processed::Both, async { vec![create_v2().await, create_v1().await] })]
375+
#[case(ProcessedReceipt::None, async { vec![] })]
376+
#[case(ProcessedReceipt::V1, async { vec![create_v1().await] })]
377+
#[case(ProcessedReceipt::V2, async { vec![create_v2().await] })]
378+
#[case(ProcessedReceipt::Both, async { vec![create_v2().await, create_v1().await] })]
380379
#[sqlx::test(migrations = "../../migrations")]
381380
async fn v1_and_v2_are_processed_successfully(
382381
#[ignore] pgpool: PgPool,
383-
#[case] expected: Processed,
382+
#[case] expected: ProcessedReceipt,
384383
#[future(awt)]
385384
#[case]
386385
receipts: Vec<DatabaseReceipt>,
@@ -402,7 +401,7 @@ mod tests {
402401

403402
let res = context.process_db_receipts(vec![]).await.unwrap();
404403

405-
assert_eq!(res, Processed::None);
404+
assert_eq!(res, ProcessedReceipt::None);
406405
}
407406

408407
#[sqlx::test(migrator = "WITHOUT_HORIZON_MIGRATIONS")]
@@ -414,7 +413,7 @@ mod tests {
414413

415414
let res = context.process_db_receipts(receipts).await.unwrap();
416415

417-
assert_eq!(res, Processed::V1);
416+
assert_eq!(res, ProcessedReceipt::V1);
418417
}
419418

420419
#[rstest::rstest]

0 commit comments

Comments
 (0)