use http_provider_macro::api_client;
use reqwest::{header::HeaderMap, Url};
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Debug)]
#[allow(dead_code)]
struct User {
id: u32,
name: String,
email: String,
}
#[derive(Deserialize, Debug)]
#[allow(dead_code)]
struct CreateUserResponse {
id: u32,
message: String,
}
#[derive(Deserialize, Debug)]
#[allow(dead_code)]
struct SearchResults {
results: Vec<User>,
total: u32,
}
#[derive(Serialize)]
struct CreateUserRequest {
name: String,
email: String,
}
#[derive(Serialize)]
struct UpdateUserRequest {
name: Option<String>,
email: Option<String>,
}
#[derive(Serialize)]
struct UserPathParams {
id: u32,
}
#[derive(Serialize)]
struct SearchQueryParams {
q: String,
limit: Option<u32>,
}
api_client!(
ApiClient,
{
{
path: "/users",
method: GET,
res: Vec<User>,
},
{
path: "/users/{id}",
method: GET,
path_params: UserPathParams,
res: User,
},
{
path: "/search",
method: GET,
query_params: SearchQueryParams,
res: SearchResults,
},
{
path: "/protected/data",
method: GET,
headers: HeaderMap,
res: User,
},
{
path: "/users",
method: POST,
req: CreateUserRequest,
res: CreateUserResponse,
},
{
path: "/users/{id}",
method: PUT,
path_params: UserPathParams,
req: UpdateUserRequest,
res: User,
},
{
path: "/users/{id}",
method: DELETE,
path_params: UserPathParams,
},
{
path: "/users/me",
method: GET,
fn_name: get_current_user,
res: User,
},
{
method: GET,
res: User,
},
}
);
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let base_url = Url::parse("https://api.example.com")?;
let client = ApiClient::new(base_url, Some(5000));
let users = client.get_users().await?;
println!("Users: {:?}", users);
let user = client.get_users_by_id(&UserPathParams { id: 42 }).await?;
println!("User: {:?}", user);
let results = client
.get_search(&SearchQueryParams {
q: "rust".to_string(),
limit: Some(10),
})
.await?;
println!("Search results: {:?}", results);
let mut headers = HeaderMap::new();
headers.insert("Authorization", "Bearer token123".parse()?);
let protected_data = client.get_protected_data(headers).await?;
println!("Protected data: {:?}", protected_data);
let new_user = client
.post_users(&CreateUserRequest {
name: "John Doe".to_string(),
email: "john@example.com".to_string(),
})
.await?;
println!("Created user: {:?}", new_user);
let updated_user = client
.put_users_by_id(
&UserPathParams { id: 42 },
&UpdateUserRequest {
name: Some("Jane Doe".to_string()),
email: None,
},
)
.await?;
println!("Updated user: {:?}", updated_user);
client
.delete_users_by_id(&UserPathParams { id: 42 })
.await?;
println!("User deleted");
let current_user = client.get_current_user().await?;
println!("Current user: {:?}", current_user);
let root_data = client.get().await?;
println!("Root data: {:?}", root_data);
Ok(())
}