feat: add filter utility function (#316)
* feat: add filter utility function * chore: typo Co-authored-by: Georgios Konstantopoulos <me@gakonst.com> * chore: typo Co-authored-by: Georgios Konstantopoulos <me@gakonst.com> Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
This commit is contained in:
parent
34d38ca40f
commit
1dda336a78
|
@ -4,6 +4,7 @@ use crate::{
|
||||||
utils::keccak256,
|
utils::keccak256,
|
||||||
};
|
};
|
||||||
use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer};
|
use serde::{ser::SerializeStruct, Deserialize, Serialize, Serializer};
|
||||||
|
use std::ops::{Range, RangeFrom, RangeTo};
|
||||||
|
|
||||||
/// A log produced by a transaction.
|
/// A log produced by a transaction.
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
@ -71,6 +72,65 @@ pub enum FilterBlockOption {
|
||||||
AtBlockHash(H256),
|
AtBlockHash(H256),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<BlockNumber> for FilterBlockOption {
|
||||||
|
fn from(block: BlockNumber) -> Self {
|
||||||
|
let block = Some(block);
|
||||||
|
FilterBlockOption::Range {
|
||||||
|
from_block: block,
|
||||||
|
to_block: block,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<U64> for FilterBlockOption {
|
||||||
|
fn from(block: U64) -> Self {
|
||||||
|
BlockNumber::from(block).into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u64> for FilterBlockOption {
|
||||||
|
fn from(block: u64) -> Self {
|
||||||
|
BlockNumber::from(block).into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Into<BlockNumber>> From<Range<T>> for FilterBlockOption {
|
||||||
|
fn from(r: Range<T>) -> Self {
|
||||||
|
let from_block = Some(r.start.into());
|
||||||
|
let to_block = Some(r.end.into());
|
||||||
|
FilterBlockOption::Range {
|
||||||
|
from_block,
|
||||||
|
to_block,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Into<BlockNumber>> From<RangeTo<T>> for FilterBlockOption {
|
||||||
|
fn from(r: RangeTo<T>) -> Self {
|
||||||
|
let to_block = Some(r.end.into());
|
||||||
|
FilterBlockOption::Range {
|
||||||
|
from_block: Some(BlockNumber::Earliest),
|
||||||
|
to_block,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Into<BlockNumber>> From<RangeFrom<T>> for FilterBlockOption {
|
||||||
|
fn from(r: RangeFrom<T>) -> Self {
|
||||||
|
let from_block = Some(r.start.into());
|
||||||
|
FilterBlockOption::Range {
|
||||||
|
from_block,
|
||||||
|
to_block: Some(BlockNumber::Latest),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<H256> for FilterBlockOption {
|
||||||
|
fn from(hash: H256) -> Self {
|
||||||
|
FilterBlockOption::AtBlockHash(hash)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Default for FilterBlockOption {
|
impl Default for FilterBlockOption {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
FilterBlockOption::Range {
|
FilterBlockOption::Range {
|
||||||
|
@ -187,6 +247,72 @@ impl Filter {
|
||||||
Self::default()
|
Self::default()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the inner filter object
|
||||||
|
///
|
||||||
|
/// *NOTE:* ranges are always inclusive
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// Match only a specific block
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use ethers::types::Filter;
|
||||||
|
/// # fn main() {
|
||||||
|
/// let filter = Filter::new().select(69u64);
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
/// This is the same as `Filter::new().from_block(1337u64).to_block(1337u64)`
|
||||||
|
///
|
||||||
|
/// Match the latest block only
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use ethers::types::{Filter, BlockNumber};
|
||||||
|
/// # fn main() {
|
||||||
|
/// let filter = Filter::new().select(BlockNumber::Latest);
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Match a block by its hash
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use ethers::types::{Filter, H256};
|
||||||
|
/// # fn main() {
|
||||||
|
/// let filter = Filter::new().select(H256::zero());
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
/// This is the same as `at_block_hash`
|
||||||
|
///
|
||||||
|
/// Match a range of blocks
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use ethers::types::{Filter, H256};
|
||||||
|
/// # fn main() {
|
||||||
|
/// let filter = Filter::new().select(0u64..100u64);
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Match all blocks in range `(1337..BlockNumber::Latest)`
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use ethers::types::{Filter, H256};
|
||||||
|
/// # fn main() {
|
||||||
|
/// let filter = Filter::new().select(1337u64..);
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Match all blocks in range `(BlockNumber::Earliest..1337)`
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use ethers::types::{Filter, H256};
|
||||||
|
/// # fn main() {
|
||||||
|
/// let filter = Filter::new().select(..1337u64);
|
||||||
|
/// # }
|
||||||
|
/// ```
|
||||||
|
pub fn select(mut self, filter: impl Into<FilterBlockOption>) -> Self {
|
||||||
|
self.block_option = filter.into();
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::wrong_self_convention)]
|
#[allow(clippy::wrong_self_convention)]
|
||||||
pub fn from_block<T: Into<BlockNumber>>(mut self, block: T) -> Self {
|
pub fn from_block<T: Into<BlockNumber>>(mut self, block: T) -> Self {
|
||||||
self.block_option = self.block_option.set_from_block(block.into());
|
self.block_option = self.block_option.set_from_block(block.into());
|
||||||
|
|
Loading…
Reference in New Issue