use std::net::Ipv4Addr;
use kynos::{prelude::*, response::status::NoContent, server::Server};
use serde::{Deserialize, Serialize};
#[derive(Schema, Serialize, Deserialize)]
struct User {
id: u64,
name: String,
}
#[derive(Schema, PathParams)]
struct UserPath {
id: u64,
}
#[allow(dead_code)]
#[derive(Schema, QueryParams)]
struct Page {
page: u32,
per_page: u32,
}
#[kynos::get("/health")]
async fn health() -> NoContent {
NoContent
}
#[kynos::get("/users")]
async fn list_users(Query(page): Query<Page>) -> Json<Vec<User>> {
println!("page {:?}, {:?} per page", page.page, page.per_page);
Json(vec![User {
id: 1,
name: "Ada Lovelace".to_owned(),
}])
}
#[kynos::get("/users/{id}")]
async fn get_user(Path(path): Path<UserPath>) -> Json<User> {
Json(User {
id: path.id,
name: "Ada Lovelace".to_owned(),
})
}
#[kynos::post("/users")]
async fn create_user(Json(user): Json<User>) -> Created<Json<User>> {
Created::at(get_user::relative_uri(UserPath { id: user.id }), Json(user))
}
#[tokio::main]
async fn main() -> kynos::Result<()> {
let router =
Router::<()>::new().mount(kynos::routes![health, list_users, get_user, create_user]);
let document = router.openapi()?;
println!("{}", document.to_json()?);
Server::new(router.build(())?)
.bind((Ipv4Addr::UNSPECIFIED, 3000))
.serve()
.await
}