use rustyx::prelude::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: Option<String>,
pub name: String,
pub email: String,
#[serde(default)]
pub age: Option<u32>,
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt().with_env_filter("info").init();
let app = RustyX::new();
app.get("/", |_req, res| async move {
res.json(json!({
"message": "Welcome to RustyX!",
"version": rustyx::VERSION
}))
});
app.get("/health", |_req, res| async move {
res.json(json!({ "status": "ok" }))
});
app.get("/api/users", |_req, res| async move {
let users = vec![
json!({ "id": "1", "name": "John Doe", "email": "john@example.com" }),
json!({ "id": "2", "name": "Jane Doe", "email": "jane@example.com" }),
];
res.json(json!({ "data": users }))
});
app.get("/api/users/:id", |req, res| async move {
let id = req.param("id").cloned().unwrap_or_default();
res.json(json!({
"id": id,
"name": "John Doe",
"email": "john@example.com"
}))
});
app.post("/api/users", |req, res| async move {
match req.json::<User>() {
Ok(mut user) => {
user.id = Some(uuid::Uuid::new_v4().to_string());
res.status(201).json(json!({
"message": "User created",
"data": user
}))
}
Err(e) => res.bad_request(&e.to_string()),
}
});
app.put("/api/users/:id", |req, res| async move {
let id = req.param("id").cloned().unwrap_or_default();
match req.json::<User>() {
Ok(mut user) => {
user.id = Some(id);
res.json(json!({
"message": "User updated",
"data": user
}))
}
Err(e) => res.bad_request(&e.to_string()),
}
});
app.delete("/api/users/:id", |req, res| async move {
let id = req.param("id").cloned().unwrap_or_default();
res.json(json!({
"message": "User deleted",
"id": id
}))
});
info!("🚀 Starting RustyX server...");
app.listen(3000).await
}