use std::collections::HashMap;
use derive_builder::Builder;
use rustify::{Client, Endpoint, Wrapper};
use rustify_derive::Endpoint;
use serde::{de::DeserializeOwned, Deserialize};
#[derive(Builder, Endpoint)]
#[endpoint(path = "/api/users", response = "Vec<User>", builder = "true")]
struct ListUsersRequest {
#[endpoint(query)]
pub page: usize,
}
#[derive(Debug, Deserialize)]
pub struct PaginationWrapper<T> {
pub page: usize,
pub per_page: usize,
pub total: usize,
pub total_pages: usize,
pub data: T,
pub support: HashMap<String, String>,
}
impl<T: DeserializeOwned + Send + Sync> Wrapper for PaginationWrapper<T> {
type Value = T;
}
#[derive(Debug, Deserialize)]
struct User {
pub id: usize,
pub email: String,
pub first_name: String,
pub last_name: String,
}
#[tokio::main]
async fn main() {
let client = Client::default("https://reqres.in/");
let endpoint = ListUsersRequest::builder().page(1).build().unwrap();
let result = endpoint.exec(&client).await;
match result {
Ok(r) => match r.wrap::<PaginationWrapper<_>>() {
Ok(d) => {
d.data.iter().for_each(print_user);
}
Err(e) => println!("Error: {:#?}", e),
},
Err(e) => println!("Error: {:#?}", e),
};
}
fn print_user(user: &User) {
println!(
"ID: {}\nEmail: {}\nFirst Name: {}\nLast Name: {}\n\n",
user.id, user.email, user.first_name, user.last_name
);
}