Type-safe and enum style API for Rust, some benefits:
- It abstracts away repetitive boilerplate code like url formatting, query / header encoding and response deserialization.
- Type-safe endpoints, readable like a spec, easy to add new or refactor existing endpoints.
- Async by default and lightweight JSON-RPC support.
Features:
- Type-safe and enum style HTTP API
- JSON-RPC with batching support
- ...
cargo add reqwest-enum
or add it to your Cargo.toml
:
[dependencies]
reqwest-enum = "0.3.2"
- Define endpoints for https://httbin.org as an enum:
pub enum HttpBin {
Get,
Post,
Bearer,
}
- Implement
Target
for the enum:
pub trait Target {
fn base_url(&self) -> &'static str;
fn method(&self) -> HTTPMethod;
fn path(&self) -> String;
fn query(&self) -> HashMap<&'static str, &'static str>;
fn headers(&self) -> HashMap<&'static str, &'static str>;
fn authentication(&self) -> Option<AuthMethod>;
fn body(&self) -> HTTPBody;
fn timeout(&self) -> Option<Duration>;
}
- Create a provider and request:
let provider = Provider::<HttpBin>::default();
let response = provider.request(HttpBin::Get).await.unwrap();
assert_eq!(response.status(), 200);
Provider also allows you to customize the request by providing a EndpointFn
or RequestBuilderFn
closure if default behavior is not sufficient:
- Need to use different endpoint based on the target.
- Need to insert custom headers or intercept the final request.
Full example can be found in examples/ethereum-rpc.
- Define Ethereum JSON-RPC methods as an enum:
pub enum EthereumRPC {
ChainId,
GasPrice,
BlockNumber,
GetBalance(&'static str),
GetBlockByNumber(&'static str, bool),
GetTransactionCount(&'static str, BlockParameter),
Call(TransactionObject, BlockParameter),
EstimateGas(TransactionObject),
SendRawTransaction(&'static str),
}
- Implement
Target
andJsonRpcTarger
for the enum:
pub trait JsonRpcTarget: Target {
fn method_name(&self) -> &'static str;
fn params(&self) -> Vec<Value>;
}
- Create a provider and request:
let provider = Provider::<EthereumRPC>::default();
let response: JsonRpcResponse<String> =
provider.request_json(EthereumRPC::ChainId).await.unwrap();
assert_eq!(response.result, "0x1");
MIT or Apache-2.0