Skip to content

Commit c171388

Browse files
committed
fix: doctest + readme
1 parent 0587bbe commit c171388

File tree

4 files changed

+68
-60
lines changed

4 files changed

+68
-60
lines changed

README.md

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,24 @@ event-scanner = "0.4.0-alpha"
5858
Create an event stream for the given event filters registered with the `EventScanner`:
5959

6060
```rust
61-
use alloy::{network::Ethereum, sol_types::SolEvent};
62-
use event_scanner::{EventFilter, EventScannerBuilder, Message};
61+
use alloy::{network::Ethereum, providers::{Provider, ProviderBuilder}, sol_types::SolEvent};
62+
use event_scanner::{EventFilter, EventScannerBuilder, Message, robust_provider::RobustProvider};
6363
use tokio_stream::StreamExt;
6464

6565
use crate::MyContract;
6666

6767
async fn run_scanner(
68-
ws_url: alloy::transports::http::reqwest::Url,
68+
ws_url: &str,
6969
contract: alloy::primitives::Address,
7070
) -> Result<(), Box<dyn std::error::Error>> {
71+
// Connect to provider
72+
let provider = ProviderBuilder::new().connect(ws_url).await?;
73+
let robust_provider = RobustProvider::new(provider.root().to_owned());
74+
7175
// Configure scanner with custom batch size (optional)
7276
let mut scanner = EventScannerBuilder::live()
7377
.max_block_range(500) // Process up to 500 blocks per batch
74-
.connect_ws::<Ethereum>(ws_url).await?;
78+
.connect(robust_provider);
7579

7680
// Register an event listener
7781
let filter = EventFilter::new()
@@ -108,48 +112,53 @@ async fn run_scanner(
108112

109113
### Building a Scanner
110114

111-
`EventScannerBuilder` provides mode-specific constructors and a functions to configure settings before connecting.
112-
Once configured, connect using one of:
115+
`EventScannerBuilder` provides mode-specific constructors and functions to configure settings before connecting.
116+
Once configured, connect using:
113117

114-
- `connect_ws::<Ethereum>(ws_url)`
115-
- `connect_ipc::<Ethereum>(path)`
116-
- `connect::<Ethereum>(robust_provider)`
118+
- `connect(robust_provider)` - Connect using a `RobustProvider` wrapping your alloy provider
117119

118120
This will connect the `EventScanner` and allow you to create event streams and start scanning in various [modes](#scanning-modes).
119121

120122
```rust
123+
use alloy::providers::{Provider, ProviderBuilder};
124+
use event_scanner::robust_provider::RobustProvider;
125+
126+
// Connect to provider (example with WebSocket)
127+
let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
128+
let robust_provider = RobustProvider::new(provider.root().to_owned());
129+
121130
// Live streaming mode
122131
let scanner = EventScannerBuilder::live()
123132
.max_block_range(500) // Optional: set max blocks per read (default: 1000)
124133
.block_confirmations(12) // Optional: set block confirmations (default: 12)
125-
.connect_ws::<Ethereum>(ws_url).await?;
134+
.connect(robust_provider.clone());
126135

127136
// Historical block range mode
128137
let scanner = EventScannerBuilder::historic()
129138
.from_block(1_000_000)
130139
.to_block(2_000_000)
131140
.max_block_range(500)
132-
.connect_ws::<Ethereum>(ws_url).await?;
141+
.connect(robust_provider.clone());
133142

134143
// Latest events mode
135144
let scanner = EventScannerBuilder::latest(100)
136145
// .from_block(1_000_000) // Optional: set start of search range
137146
// .to_block(2_000_000) // Optional: set end of search range
138147
.max_block_range(500)
139-
.connect_ws::<Ethereum>(ws_url).await?;
148+
.connect(robust_provider.clone());
140149

141150
// Sync from block then switch to live mode
142151
let scanner = EventScannerBuilder::sync()
143152
.from_block(100)
144153
.max_block_range(500)
145154
.block_confirmations(12)
146-
.connect_ws::<Ethereum>(ws_url).await?;
155+
.connect(robust_provider.clone());
147156

148157
// Sync the latest 60 events then switch to live mode
149158
let scanner = EventScannerBuilder::sync()
150159
.from_latest(60)
151160
.block_confirmations(12)
152-
.connect_ws::<Ethereum>(ws_url).await?;
161+
.connect(robust_provider);
153162
```
154163

155164
Invoking `scanner.start()` starts the scanner in the specified mode.

src/block_range_scanner.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,14 @@
55
//! use std::ops::RangeInclusive;
66
//! use tokio_stream::{StreamExt, wrappers::ReceiverStream};
77
//!
8-
//! use alloy::transports::http::reqwest::Url;
8+
//! use alloy::providers::{Provider, ProviderBuilder};
99
//! use event_scanner::{
1010
//! ScannerError,
1111
//! block_range_scanner::{
1212
//! BlockRangeScanner, BlockRangeScannerClient, DEFAULT_BLOCK_CONFIRMATIONS,
1313
//! DEFAULT_MAX_BLOCK_RANGE, Message,
1414
//! },
15+
//! robust_provider::RobustProvider,
1516
//! };
1617
//! use tokio::time::Duration;
1718
//! use tracing::{error, info};
@@ -22,9 +23,9 @@
2223
//! tracing_subscriber::fmt::init();
2324
//!
2425
//! // Configuration
25-
//! let block_range_scanner = BlockRangeScanner::new()
26-
//! .connect_ws::<Ethereum>(Url::parse("ws://localhost:8546").unwrap())
27-
//! .await?;
26+
//! let provider = ProviderBuilder::new().connect("ws://localhost:8546").await?;
27+
//! let robust_provider = RobustProvider::new(provider.root().to_owned());
28+
//! let block_range_scanner = BlockRangeScanner::new().connect(robust_provider);
2829
//!
2930
//! // Create client to send subscribe command to block scanner
3031
//! let client: BlockRangeScannerClient = block_range_scanner.run()?;

src/event_scanner/scanner/mod.rs

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -77,17 +77,16 @@ impl EventScannerBuilder<Unspecified> {
7777
/// # Example
7878
///
7979
/// ```no_run
80-
/// # use alloy::network::Ethereum;
81-
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message};
80+
/// # use alloy::{network::Ethereum, providers::{Provider, ProviderBuilder}};
81+
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message, robust_provider::RobustProvider};
8282
/// # use tokio_stream::StreamExt;
8383
/// #
8484
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
85-
/// # let ws_url = "ws://localhost:8545".parse()?;
8685
/// # let contract_address = alloy::primitives::address!("0xd8dA6BF26964af9d7eed9e03e53415d37aa96045");
8786
/// // Stream all events from genesis to latest block
88-
/// let mut scanner = EventScannerBuilder::historic()
89-
/// .connect_ws::<Ethereum>(ws_url)
90-
/// .await?;
87+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
88+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
89+
/// let mut scanner = EventScannerBuilder::historic().connect(robust_provider);
9190
///
9291
/// let filter = EventFilter::new().contract_address(contract_address);
9392
/// let mut stream = scanner.subscribe(filter);
@@ -104,17 +103,17 @@ impl EventScannerBuilder<Unspecified> {
104103
/// Specifying a custom block range:
105104
///
106105
/// ```no_run
107-
/// # use alloy::network::Ethereum;
108-
/// # use event_scanner::EventScannerBuilder;
106+
/// # use alloy::{network::Ethereum, providers::{Provider, ProviderBuilder}};
107+
/// # use event_scanner::{EventScannerBuilder, robust_provider::RobustProvider};
109108
/// #
110109
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
111-
/// # let ws_url = "ws://localhost:8545".parse()?;
112110
/// // Stream events between blocks [1_000_000, 2_000_000]
111+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
112+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
113113
/// let mut scanner = EventScannerBuilder::historic()
114114
/// .from_block(1_000_000)
115115
/// .to_block(2_000_000)
116-
/// .connect_ws::<Ethereum>(ws_url)
117-
/// .await?;
116+
/// .connect(robust_provider);
118117
/// # Ok(())
119118
/// # }
120119
/// ```
@@ -143,18 +142,18 @@ impl EventScannerBuilder<Unspecified> {
143142
/// # Example
144143
///
145144
/// ```no_run
146-
/// # use alloy::network::Ethereum;
147-
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message};
145+
/// # use alloy::{network::Ethereum, providers::{Provider, ProviderBuilder}};
146+
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message, robust_provider::RobustProvider};
148147
/// # use tokio_stream::StreamExt;
149148
/// #
150149
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
151-
/// # let ws_url = "ws://localhost:8545".parse()?;
152150
/// # let contract_address = alloy::primitives::address!("0xd8dA6BF26964af9d7eed9e03e53415d37aa96045");
153151
/// // Stream new events as they arrive
152+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
153+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
154154
/// let mut scanner = EventScannerBuilder::live()
155155
/// .block_confirmations(20)
156-
/// .connect_ws::<Ethereum>(ws_url)
157-
/// .await?;
156+
/// .connect(robust_provider);
158157
///
159158
/// let filter = EventFilter::new().contract_address(contract_address);
160159
/// let mut stream = scanner.subscribe(filter);
@@ -229,17 +228,16 @@ impl EventScannerBuilder<Unspecified> {
229228
/// # Example
230229
///
231230
/// ```no_run
232-
/// # use alloy::{network::Ethereum, primitives::Address};
233-
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message};
231+
/// # use alloy::{network::Ethereum, primitives::Address, providers::{Provider, ProviderBuilder}};
232+
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message, robust_provider::RobustProvider};
234233
/// # use tokio_stream::StreamExt;
235234
/// #
236235
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
237-
/// # let ws_url = "ws://localhost:8545".parse()?;
238236
/// # let contract_address = alloy::primitives::address!("0xd8dA6BF26964af9d7eed9e03e53415d37aa96045");
239237
/// // Collect the latest 10 events across Earliest..=Latest
240-
/// let mut scanner = EventScannerBuilder::latest(10)
241-
/// .connect_ws::<Ethereum>(ws_url)
242-
/// .await?;
238+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
239+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
240+
/// let mut scanner = EventScannerBuilder::latest(10).connect(robust_provider);
243241
///
244242
/// let filter = EventFilter::new().contract_address(contract_address);
245243
/// let mut stream = scanner.subscribe(filter);
@@ -257,17 +255,17 @@ impl EventScannerBuilder<Unspecified> {
257255
/// Restricting to a specific block range:
258256
///
259257
/// ```no_run
260-
/// # use alloy::network::Ethereum;
261-
/// # use event_scanner::EventScannerBuilder;
258+
/// # use alloy::{network::Ethereum, providers::{Provider, ProviderBuilder}};
259+
/// # use event_scanner::{EventScannerBuilder, robust_provider::RobustProvider};
262260
/// #
263261
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
264-
/// # let ws_url = "ws://localhost:8545".parse()?;
265262
/// // Collect the latest 5 events between blocks [1_000_000, 1_100_000]
263+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
264+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
266265
/// let mut scanner = EventScannerBuilder::latest(5)
267266
/// .from_block(1_000_000)
268267
/// .to_block(1_100_000)
269-
/// .connect_ws::<Ethereum>(ws_url)
270-
/// .await?;
268+
/// .connect(robust_provider);
271269
/// # Ok(())
272270
/// # }
273271
/// ```

src/event_scanner/scanner/sync/mod.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@ impl EventScannerBuilder<Synchronize> {
2424
/// # Example
2525
///
2626
/// ```no_run
27-
/// # use alloy::network::Ethereum;
28-
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message};
27+
/// # use alloy::{network::Ethereum, providers::{Provider, ProviderBuilder}};
28+
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message, robust_provider::RobustProvider};
2929
/// # use tokio_stream::StreamExt;
3030
/// #
3131
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
32-
/// # let ws_url = "ws://localhost:8545".parse()?;
3332
/// # let contract_address = alloy::primitives::address!("0xd8dA6BF26964af9d7eed9e03e53415d37aa96045");
3433
/// // Fetch the latest 10 events, then stream new events continuously
34+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
35+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
3536
/// let mut scanner = EventScannerBuilder::sync()
3637
/// .from_latest(10)
37-
/// .connect_ws::<Ethereum>(ws_url)
38-
/// .await?;
38+
/// .connect(robust_provider);
3939
///
4040
/// let filter = EventFilter::new().contract_address(contract_address);
4141
/// let mut stream = scanner.subscribe(filter);
@@ -120,18 +120,18 @@ impl EventScannerBuilder<Synchronize> {
120120
/// # Example
121121
///
122122
/// ```no_run
123-
/// # use alloy::network::Ethereum;
124-
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message};
123+
/// # use alloy::{network::Ethereum, providers::{Provider, ProviderBuilder}};
124+
/// # use event_scanner::{EventFilter, EventScannerBuilder, Message, robust_provider::RobustProvider};
125125
/// # use tokio_stream::StreamExt;
126126
/// #
127127
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
128-
/// # let ws_url = "ws://localhost:8545".parse()?;
129128
/// # let contract_address = alloy::primitives::address!("0xd8dA6BF26964af9d7eed9e03e53415d37aa96045");
130129
/// // Sync from block 1_000_000 to present, then stream new events
130+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
131+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
131132
/// let mut scanner = EventScannerBuilder::sync()
132133
/// .from_block(1_000_000)
133-
/// .connect_ws::<Ethereum>(ws_url)
134-
/// .await?;
134+
/// .connect(robust_provider);
135135
///
136136
/// let filter = EventFilter::new().contract_address(contract_address);
137137
/// let mut stream = scanner.subscribe(filter);
@@ -159,16 +159,16 @@ impl EventScannerBuilder<Synchronize> {
159159
/// Using block tags:
160160
///
161161
/// ```no_run
162-
/// # use alloy::{network::Ethereum, eips::BlockNumberOrTag};
163-
/// # use event_scanner::EventScannerBuilder;
162+
/// # use alloy::{network::Ethereum, eips::BlockNumberOrTag, providers::{Provider, ProviderBuilder}};
163+
/// # use event_scanner::{EventScannerBuilder, robust_provider::RobustProvider};
164164
/// #
165165
/// # async fn example() -> Result<(), Box<dyn std::error::Error>> {
166-
/// # let ws_url = "ws://localhost:8545".parse()?;
167166
/// // Sync from genesis block
167+
/// let provider = ProviderBuilder::new().connect("ws://localhost:8545").await?;
168+
/// let robust_provider = RobustProvider::new(provider.root().to_owned());
168169
/// let mut scanner = EventScannerBuilder::sync()
169170
/// .from_block(BlockNumberOrTag::Earliest)
170-
/// .connect_ws::<Ethereum>(ws_url)
171-
/// .await?;
171+
/// .connect(robust_provider);
172172
/// # Ok(())
173173
/// # }
174174
/// ```

0 commit comments

Comments
 (0)