From e297a4468aaf94484a2276857fec6d6e7a9866fd Mon Sep 17 00:00:00 2001 From: Thomas Eizinger Date: Thu, 18 Nov 2021 18:07:50 +1100 Subject: [PATCH] Simplify invoking `oracle::GetAnnouncement` Moving the error message into the handler reduces complexity in the cfd actor. --- daemon/src/maker_cfd.rs | 3 +-- daemon/src/oracle.rs | 7 ++++++- daemon/tests/harness/mocks/mod.rs | 2 +- daemon/tests/harness/mocks/oracle.rs | 10 ++++++++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/daemon/src/maker_cfd.rs b/daemon/src/maker_cfd.rs index eb86ee0..2b8673f 100644 --- a/daemon/src/maker_cfd.rs +++ b/daemon/src/maker_cfd.rs @@ -580,8 +580,7 @@ where let offer_announcement = self .oracle_actor .send(oracle::GetAnnouncement(cfd.order.oracle_event_id)) - .await? - .with_context(|| format!("Announcement {} not found", cfd.order.oracle_event_id))?; + .await??; // 3. Notify the taker that we are ready for contract setup // Use `.send` here to ensure we only continue once the message has been sent diff --git a/daemon/src/oracle.rs b/daemon/src/oracle.rs index 872f6df..edf2f0a 100644 --- a/daemon/src/oracle.rs +++ b/daemon/src/oracle.rs @@ -218,7 +218,7 @@ impl Actor { &mut self, msg: GetAnnouncement, _ctx: &mut xtra::Context, - ) -> Option { + ) -> Result { self.announcements .get_key_value(&msg.0) .map(|(id, (time, nonce_pks))| Announcement { @@ -226,6 +226,7 @@ impl Actor { expected_outcome_time: *time, nonce_pks: nonce_pks.clone(), }) + .ok_or(NoAnnouncement(msg.0)) } fn handle_new_announcement_fetched( @@ -243,6 +244,10 @@ impl Actor { } } +#[derive(Debug, Clone, thiserror::Error)] +#[error("Announcement {0} not found")] +pub struct NoAnnouncement(pub BitMexPriceEventId); + #[async_trait] impl xtra::Handler for Actor { async fn handle(&mut self, msg: NewAttestationFetched, _ctx: &mut xtra::Context) { diff --git a/daemon/tests/harness/mocks/mod.rs b/daemon/tests/harness/mocks/mod.rs index 03d806f..7ab066b 100644 --- a/daemon/tests/harness/mocks/mod.rs +++ b/daemon/tests/harness/mocks/mod.rs @@ -58,7 +58,7 @@ impl Mocks { self.oracle() .await .expect_get_announcement() - .return_const(Some(oracle::dummy_announcement())); + .return_const(Ok(oracle::dummy_announcement())); } pub async fn mock_oracle_monitor_attestation(&mut self) { diff --git a/daemon/tests/harness/mocks/oracle.rs b/daemon/tests/harness/mocks/oracle.rs index 4aca9d4..e64d959 100644 --- a/daemon/tests/harness/mocks/oracle.rs +++ b/daemon/tests/harness/mocks/oracle.rs @@ -18,7 +18,10 @@ impl Oracle for OracleActor {} #[xtra_productivity(message_impl = false)] impl OracleActor { - async fn handle(&mut self, msg: oracle::GetAnnouncement) -> Option { + async fn handle( + &mut self, + msg: oracle::GetAnnouncement, + ) -> Result { self.mock.lock().await.get_announcement(msg) } @@ -33,7 +36,10 @@ impl OracleActor { #[automock] pub trait Oracle { - fn get_announcement(&mut self, _msg: oracle::GetAnnouncement) -> Option { + fn get_announcement( + &mut self, + _msg: oracle::GetAnnouncement, + ) -> Result { unreachable!("mockall will reimplement this method") }