Skip to main content

jam_tooling/
args.rs

1use anyhow::anyhow;
2use jsonrpsee::ws_client::{WsClient, WsClientBuilder};
3use url::Url;
4
5#[derive(clap::Args, Debug)]
6#[group(skip)]
7pub struct CommonArgs {
8	/// The URL for the RPC connection.
9	#[arg(long, env = "JAM_RPC", default_value_t = String::from("ws://localhost:19800"))]
10	pub rpc: String,
11}
12
13impl CommonArgs {
14	pub fn rpc_url(&self, val_index: u16) -> anyhow::Result<Url> {
15		let mut uri = Url::parse(&self.rpc)?;
16		if val_index > 0 && uri.port().is_none() {
17			return Err(anyhow!("Cannot increment port number for RPC URL without a port"));
18		}
19		let port = uri.port().and_then(|p| p.checked_add(val_index));
20		uri.set_port(port).map_err(|()| anyhow!("Cannot set port number for RPC URL"))?;
21		Ok(uri)
22	}
23
24	pub async fn connect_rpc(&self, val_index: u16) -> anyhow::Result<WsClient> {
25		let uri = self.rpc_url(val_index)?;
26		Ok(WsClientBuilder::default()
27			.max_request_size(MAX_REQUEST_SIZE)
28			.max_response_size(MAX_RESPONSE_SIZE)
29			.build(&uri)
30			.await?)
31	}
32}
33
34const MAX_REQUEST_SIZE: u32 = 100 * 1024 * 1024;
35const MAX_RESPONSE_SIZE: u32 = 100 * 1024 * 1024;