Skip to main content

Crate restep

Crate restep 

Source
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§

endpoint
Creates a function that returns the specified path.