- No boilerplate: Driven by proc-macros
- No client lock-in: Complete freedom over underlying HTTP client
- Lightweight: Only depends on syn and serde
- Async-ready
We take a trait as input to a proc-macro and output another one that has default implementations for all the functions. This allows us to take away all the boilerplate of making JSON-RPC calls and you get to define a nice interface at the same time!
-
Depend on
jsonrpc_client
:[dependencies] jsonrpc_client = { version = "*", features = ["reqwest"] }
-
Define a trait that describes the JSON-RPC API you want to talk to and annotate it with
#[jsonrpc_client::api]
:#[jsonrpc_client::api] pub trait Math { async fn subtract(&self, subtrahend: i64, minuend: i64) -> i64; }
-
Define your client:
#[jsonrpc_client::implement(Math)] struct Client { inner: reqwest::Client, base_url: reqwest::Url, }
-
Start using your client!
Currently, the client supports several backends, all of them can be activated via a separate feature-flag:
- reqwest
- surf
- isahc
Support for more backends is welcomed.
Unfortunately, not all can be supported. In particular:
- hreq: Cannot be supported because their
Agent
takes&mut self
for sending a request which doesn't work with theSendRequest
trait. - awc: Cannot be supported because their
Client
does not implementSend
.