Expand description

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(&params)
}
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(&params));
        let customer = self.client
            .get(url)
            .send()
            .await?
            .json()
            .await?;
        Ok(customer)
    }
}

Attribute Macros

Creates a function that returns the specified path.