use neocrates::axum::{
Router,
routing::{get, post},
};
use neocrates::helper::core::axum_extractor::{DetailedJson, LoggedJson};
use neocrates::serde::{Deserialize, Serialize};
use neocrates::tokio;
#[derive(Debug, Deserialize, Serialize)]
struct CreateUserRequest {
name: String,
email: String,
age: u32,
}
#[derive(Debug, Serialize)]
struct UserResponse {
id: u64,
name: String,
email: String,
age: u32,
}
async fn create_user_logged(LoggedJson(payload): LoggedJson<CreateUserRequest>) -> String {
println!("Creating user with LoggedJson: {:?}", payload);
let response = UserResponse {
id: 1,
name: payload.name,
email: payload.email,
age: payload.age,
};
neocrates::serde_json::to_string_pretty(&response).unwrap()
}
async fn create_user_detailed(DetailedJson(payload): DetailedJson<CreateUserRequest>) -> String {
println!("Creating user with DetailedJson: {:?}", payload);
let response = UserResponse {
id: 2,
name: payload.name,
email: payload.email,
age: payload.age,
};
neocrates::serde_json::to_string_pretty(&response).unwrap()
}
async fn health_check() -> &'static str {
"OK"
}
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/", get(health_check))
.route("/users/logged", post(create_user_logged))
.route("/users/detailed", post(create_user_detailed));
let listener = neocrates::tokio::net::TcpListener::bind("127.0.0.1:3000")
.await
.unwrap();
println!("Server running on http://127.0.0.1:3000");
println!("Try the following endpoints:");
println!(" - GET / (health check)");
println!(" - POST /users/logged (using LoggedJson)");
println!(" - POST /users/detailed (using DetailedJson)");
neocrates::axum::serve(listener, app).await.unwrap();
}