#endpoint #rest #api

macro restep

Simple and useful REST API endpoint generator

3 releases (breaking)

0.3.0 Aug 16, 2022
0.2.0 Aug 16, 2022
0.1.0 Aug 15, 2022

#1355 in Procedural macros

Custom license

11KB
134 lines

Crates.io Docs.rs

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(&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)
    }
}

Dependencies

~2MB
~42K SLoC