use http_provider_macro::api_client;
use serde::{Deserialize, Serialize};
#[derive(Deserialize, Debug)]
#[allow(dead_code)]
struct User {
id: u32,
name: String,
}
#[derive(Serialize)]
struct UserPathParams {
id: u32,
}
api_client!(
ApiClient,
{
{
path: "/users/{id}",
method: GET,
path_params: UserPathParams,
res: User,
},
}
);
struct MockProvider;
impl ApiClientTrait for MockProvider {
async fn get_users_by_id(&self, path_params: &UserPathParams) -> Result<User, ApiClientError> {
Ok(User {
id: path_params.id,
name: format!("User {}", path_params.id),
})
}
}
async fn get_user_name<P: ApiClientTrait>(
provider: &P,
user_id: u32,
) -> Result<String, ApiClientError> {
let user = provider
.get_users_by_id(&UserPathParams { id: user_id })
.await?;
Ok(user.name)
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mock = MockProvider;
let user = mock.get_users_by_id(&UserPathParams { id: 42 }).await?;
println!("Mock user: {:?}", user);
let name = get_user_name(&mock, 42).await?;
println!("User name: {}", name);
Ok(())
}