jsonrpc_client 0.7.1

An async, macro-driven JSON-RPC client with pluggable backends.
Documentation
use anyhow::{Context, Result};
use bitcoincore_rpc_json::GetBlockchainInfoResult;
use testcontainers::{images::coblox_bitcoincore::BitcoinCore, *};

#[jsonrpc_client::api(version = "1.0")]
pub trait BitcoindRpc {
    async fn getblockchaininfo(&self) -> GetBlockchainInfoResult;
}

#[jsonrpc_client::implement(BitcoindRpc)]
struct Client {
    inner: reqwest::Client,
    base_url: jsonrpc_client::Url,
}

impl Client {
    fn new(base_url: String) -> Result<Self> {
        Ok(Self {
            inner: reqwest::Client::new(),
            base_url: base_url.parse()?,
        })
    }
}

#[tokio::main]
async fn main() -> Result<()> {
    let cli = clients::Cli::default();
    let container = cli.run(BitcoinCore::default());
    let auth = container.image().auth();

    let client = Client::new(format!(
        "http://{}:{}@localhost:{}",
        auth.username(),
        auth.password(),
        container
            .get_host_port(18443)
            .context("port 18443 was not exposed")?
    ))?;

    let blockchain_info = client.getblockchaininfo().await?;

    println!("{:?}", blockchain_info);

    Ok(())
}