Skip to main content

chaincodec_stream/
config.rs

1//! Stream engine configuration.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// Configuration for a single chain's RPC connection.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct ChainRpcConfig {
9    /// WebSocket or HTTP RPC endpoint, e.g. "wss://mainnet.infura.io/ws/v3/..."
10    pub rpc_url: String,
11    /// Maximum retry attempts on connection failure
12    #[serde(default = "default_max_retries")]
13    pub max_retries: u32,
14    /// Initial backoff in milliseconds
15    #[serde(default = "default_backoff_ms")]
16    pub backoff_ms: u64,
17    /// Optional contract addresses to filter (empty = all contracts)
18    #[serde(default)]
19    pub filter_addresses: Vec<String>,
20}
21
22fn default_max_retries() -> u32 { 5 }
23fn default_backoff_ms() -> u64 { 500 }
24
25/// Top-level streaming configuration.
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct StreamConfig {
28    /// chain slug → RPC config
29    pub chains: HashMap<String, ChainRpcConfig>,
30    /// Schema names to subscribe to (empty = all schemas in registry)
31    #[serde(default)]
32    pub schemas: Vec<String>,
33    /// Broadcast channel capacity
34    #[serde(default = "default_channel_capacity")]
35    pub channel_capacity: usize,
36    /// Whether to skip events with no matching schema
37    #[serde(default = "bool_true")]
38    pub skip_unknown: bool,
39}
40
41fn default_channel_capacity() -> usize { 1_024 }
42fn bool_true() -> bool { true }
43
44impl StreamConfig {
45    /// Create a simple config for a single chain.
46    pub fn single_chain(chain: impl Into<String>, rpc_url: impl Into<String>) -> Self {
47        let mut chains = HashMap::new();
48        chains.insert(
49            chain.into(),
50            ChainRpcConfig {
51                rpc_url: rpc_url.into(),
52                max_retries: 5,
53                backoff_ms: 500,
54                filter_addresses: vec![],
55            },
56        );
57        Self {
58            chains,
59            schemas: vec![],
60            channel_capacity: 1_024,
61            skip_unknown: true,
62        }
63    }
64}