From 13ce18fd3b0f995183ce5cc14a85133e28f994dc Mon Sep 17 00:00:00 2001 From: James Prestwich <10149425+prestwich@users.noreply.github.com> Date: Sun, 17 Jul 2022 11:26:16 -0700 Subject: [PATCH] feature: allow event builder to stream with meta (#1483) * feature: allow event builder to stream with meta * doc: improve rustdoc * feature: subscribe_with_meta * chore: fmt --- CHANGELOG.md | 4 +++- ethers-contract/src/event.rs | 42 ++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 092dfb3b..13d57870 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,7 +106,7 @@ - Make `ethers-solc` optional dependency of `ethers`, needs `ethers-solc` feature to activate [#1463](https://github.com/gakonst/ethers-rs/pull/1463) -- Add `rawMetadata:String` field to configurable contract output +- Add `rawMetadata:String` field to configurable contract output [#1365](https://github.com/gakonst/ethers-rs/pull/1365) - Use relative source paths and `solc --base-path` [#1317](https://github.com/gakonst/ethers-rs/pull/1317) @@ -237,6 +237,8 @@ ### Unreleased +- Add `Event::stream_with_meta` and `Event::subscribe_with_meta` + [#1483](https://github.com/gakonst/ethers-rs/pull/1483) - Added tx builder methods to `ContractFactory` [#1289](https://github.com/gakonst/ethers-rs/pull/1289) - Relax Clone requirements when Arc is used diff --git a/ethers-contract/src/event.rs b/ethers-contract/src/event.rs index bc393e70..01fc23f0 100644 --- a/ethers-contract/src/event.rs +++ b/ethers-contract/src/event.rs @@ -164,6 +164,26 @@ where self.provider.watch(&self.filter).await.map_err(ContractError::MiddlewareError)?; Ok(EventStream::new(filter.id, filter, Box::new(move |log| self.parse_log(log)))) } + + /// As [`Self::stream`], but does not discard [`Log`] metadata. + pub async fn stream_with_meta( + &'a self, + ) -> Result< + // Wraps the FilterWatcher with a mapping to the event + EventStream<'a, FilterWatcher<'a, M::Provider, Log>, (D, LogMeta), ContractError>, + ContractError, + > { + let filter = + self.provider.watch(&self.filter).await.map_err(ContractError::MiddlewareError)?; + Ok(EventStream::new( + filter.id, + filter, + Box::new(move |log| { + let meta = LogMeta::from(&log); + Ok((self.parse_log(log)?, meta)) + }), + )) + } } impl<'a, M, D> Event<'a, M, D> @@ -189,6 +209,28 @@ where .map_err(ContractError::MiddlewareError)?; Ok(EventStream::new(filter.id, filter, Box::new(move |log| self.parse_log(log)))) } + + pub async fn subscribe_with_meta( + &'a self, + ) -> Result< + // Wraps the SubscriptionStream with a mapping to the event + EventStream<'a, SubscriptionStream<'a, M::Provider, Log>, (D, LogMeta), ContractError>, + ContractError, + > { + let filter = self + .provider + .subscribe_logs(&self.filter) + .await + .map_err(ContractError::MiddlewareError)?; + Ok(EventStream::new( + filter.id, + filter, + Box::new(move |log| { + let meta = LogMeta::from(&log); + Ok((self.parse_log(log)?, meta)) + }), + )) + } } impl Event<'_, M, D>