Skip to main content

ethos_bitcoind/transport/
rpc_client.rs

1use std::fmt;
2use std::result::Result;
3use std::sync::Arc;
4
5use crate::transport::core::{TransportError, TransportTrait};
6use crate::transport::DefaultTransport;
7
8/// Thin wrapper around a transport for making RPC calls
9pub struct RpcClient {
10    transport: Arc<dyn TransportTrait>,
11}
12
13impl fmt::Debug for RpcClient {
14    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15        f.debug_struct("RpcClient").field("transport", &"<dyn TransportTrait>").finish()
16    }
17}
18
19impl RpcClient {
20    /// Wrap an existing transport (no URL+auth dance)
21    pub fn from_transport(inner: Arc<dyn TransportTrait>) -> Self { Self { transport: inner } }
22
23    /// Create a new RPC client with socket path
24    pub fn new(socket_path: &str) -> Self {
25        let transport = DefaultTransport::new(socket_path, None);
26        Self { transport: Arc::new(transport) }
27    }
28
29    /// Call a JSON-RPC method
30    pub async fn call_method(
31        &self,
32        method: &str,
33        params: &[serde_json::Value],
34    ) -> Result<serde_json::Value, TransportError> {
35        self.transport.send_request(method, params).await
36    }
37}