use {
amiya::{m, middleware::Router, Context, Result, StatusCode},
serde::{Deserialize, Serialize},
serde_json::{Map, Value},
};
async fn parse_query_object(mut ctx: Context<'_, ()>) -> Result {
let qm: Map<String, Value> = ctx.req.query()?;
ctx.next().await?;
ctx.resp.set_body(Value::Object(qm));
Ok(())
}
#[derive(Debug, Deserialize, Serialize)]
struct SearchQuery {
keyword: String,
city: Option<String>,
offset: Option<usize>,
}
async fn parse_query_struct(mut ctx: Context<'_, ()>) -> Result {
let query: SearchQuery = if let Ok(query) = ctx.req.query() {
query
} else {
ctx.resp.set_status(StatusCode::BadRequest);
return Ok(());
};
ctx.next().await?;
ctx.resp.set_body(serde_json::to_value(query)?);
Ok(())
}
fn main() {
#[rustfmt::skip]
let router = Router::new()
.at("object").get(m!(parse_query_object)).done()
.at("struct").get(m!(parse_query_struct)).done();
let app = amiya::new().uses(router);
app.listen("[::]:8080").unwrap();
std::thread::park();
}