3 releases (breaking)
0.3.0 | Aug 16, 2022 |
---|---|
0.2.0 | Aug 16, 2022 |
0.1.0 | Aug 15, 2022 |
#1498 in Procedural macros
11KB
134 lines
restep
Restep can create highly readable APIClient.
Usage
Automatically generates the endpoint()
function that returns the specified endpoint.
Basic
use restep::endpoint;
#[endpoint("/customers")]
fn simple() -> String {
// You can use `fn endpoint() -> String` in this function.
endpoint()
}
assert_eq!(simple(), "/customers");
Path Parameters
use restep::endpoint;
struct PathParameters {
customer_id: i32,
}
#[endpoint("/customers/{customer_id}", params = "PathParameters")]
fn dynamic_route() -> String {
let params = PathParameters { customer_id: 1 };
// You can use `fn endpoint(params: &PathParameters) -> String` in this function.
endpoint(¶ms)
}
assert_eq!(dynamic_route(), "/customers/1");
impl
use restep::endpoint;
struct APIClient;
// Also You can change the function name.
#[endpoint("/customers", name = "__endpoint")]
impl APIClient {
pub fn path() -> String {
Self::__endpoint()
}
}
assert_eq!(APIClient::path(), "/customers");
Examples
RealWorld
use restep::endpoint;
#[derive(serde::Deserialize)]
struct Customer {
id: i32,
name: String,
}
struct APIClient {
client: reqwest::Client,
}
struct PathParameters {
customer_id: i32,
}
impl APIClient {
#[endpoint("/customer/{customer_id}", params = "PathParameters")]
async fn get_customer(&self, params: PathParameters) -> anyhow::Result<Customer> {
let url = format!("{}{}", std::env::var("BASE_URL").unwrap(), endpoint(¶ms));
let customer = self.client
.get(url)
.send()
.await?
.json()
.await?;
Ok(customer)
}
}
Dependencies
~2MB
~42K SLoC