use std::str::FromStr;
use derive_builder::Builder;
use rustify::{errors::ClientError, Client, Endpoint, MiddleWare};
use rustify_derive::Endpoint;
use serde::{Deserialize, Serialize};
#[derive(Builder, Default, Endpoint, Serialize)]
#[endpoint(
path = "users",
method = "POST",
response = "CreateUserResponse",
builder = "true"
)]
#[builder(setter(into, strip_option), default)]
struct CreateUserRequest {
pub name: String,
pub job: String,
pub opt: Option<String>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct CreateUserResponse {
pub id: String,
pub created_at: String,
}
struct Middle {}
impl MiddleWare for Middle {
fn request<E: Endpoint>(
&self,
_: &E,
req: &mut http::Request<Vec<u8>>,
) -> Result<(), ClientError> {
let url = url::Url::parse(req.uri().to_string().as_str()).unwrap();
let mut url_c = url.clone();
let mut segs: Vec<&str> = url.path_segments().unwrap().collect();
segs.insert(0, "api");
url_c.path_segments_mut().unwrap().clear().extend(segs);
*req.uri_mut() = http::Uri::from_str(url_c.as_str()).unwrap();
Ok(())
}
fn response<E: Endpoint>(
&self,
_: &E,
_: &mut http::Response<Vec<u8>>,
) -> Result<(), ClientError> {
Ok(())
}
}
#[tokio::main]
async fn main() {
let client = Client::default("https://reqres.in/");
let endpoint = CreateUserRequest::builder()
.name("John")
.job("Programmer")
.build()
.unwrap();
let name = endpoint.name.clone();
let result = endpoint
.with_middleware(&Middle {})
.exec(&client)
.await
.unwrap()
.parse()
.unwrap();
println!(
"Created user {} with ID {} at {}",
name, result.id, result.created_at
);
}