#client #api #macro #model #rest #mod #models #struct #pub

api-client

Provides a macro for quickly creating REST api client structs

8 releases

Uses new Rust 2021

0.1.7 Sep 2, 2022
0.1.6 Sep 2, 2022

#857 in Rust patterns

27 downloads per month

MIT license

20KB
284 lines

API Client   MIT licensed crates.io Build Status Documentation

This project provides a macro for quickly creating REST api client structs in Rust.

Adding to project

[dependencies]
api-client = "0.1"

Example

mod api {
    use api_client::{api, Api};

    pub use models::*;

    mod models {
        use serde::{Deserialize, Serialize};

        #[derive(Debug, PartialEq, Eq, Deserialize, Serialize)]
        pub struct Todo {
            #[serde(rename = "userId")]
            pub user_id: u32,
            pub id: u32,
            pub title: String,
            pub completed: bool,
        }

        #[derive(Debug, Serialize)]
        pub struct CreateTodo {
            #[serde(rename = "userId")]
            pub user_id: u32,
            pub title: String,
            pub completed: bool,
        }

        #[derive(Debug, Default, Serialize)]
        pub struct UpdateTodo {
            #[serde(rename = "userId", skip_serializing_if = "Option::is_none")]
            pub user_id: Option<u32>,
            #[serde(skip_serializing_if = "Option::is_none")]
            pub title: Option<String>,
            #[serde(skip_serializing_if = "Option::is_none")]
            pub completed: Option<bool>,
        }
    }

    api!(pub struct JsonPlaceholder);

    const BASE_URL: &str = "https://jsonplaceholder.typicode.com";

    impl JsonPlaceholder {
        pub fn new() -> Self {
            Api::new()
        }

        api! {
            pub fn todos() -> Json<Vec<Todo>> {
                GET "{BASE_URL}/todos"
            }

            pub fn todo(id: u32) -> Json<Todo> {
                GET "{BASE_URL}/todos/{id}"
            }

            pub fn create_todo(request: Json<CreateTodo>) -> Json<Todo> {
                POST "{BASE_URL}/todos"
            }

            pub fn replace_todo(request: Json<Todo>, id: u32) -> Json<Todo> {
                PUT "{BASE_URL}/todos/{id}"
            }

            pub fn update_todo(request: Json<UpdateTodo>, id: u32) -> Json<Todo> {
                PATCH "{BASE_URL}/todos/{id}"
            }

            pub fn delete_todo(id: u32) -> StatusCode {
                DELETE "{BASE_URL}/todos/{id}"
            }
        }
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
    let json_placeholder = api::JsonPlaceholder::new();

    let todo_1 = json_placeholder.todo(1).await?;
    println!("{:?}", todo_1);

    Ok(())
}

Dependencies

~3–11MB
~232K SLoC