6 releases
0.5.1 | Apr 6, 2020 |
---|---|
0.5.0 | Apr 2, 2020 |
0.5.0-rc.2 | Mar 31, 2020 |
#102 in #async-std
25 downloads per month
180KB
3.5K
SLoC
This crate provides integration with tokio-postgres.
Example
use roa::{App, Context, throw};
use roa::http::StatusCode;
use roa_pg::{connect, Client};
use std::sync::Arc;
use std::error::Error;
use roa::query::query_parser;
use roa::preload::*;
use async_std::task::spawn;
#[derive(Clone)]
struct State {
pg: Arc<Client>
}
impl State {
pub async fn new(pg_url: &str) -> Result<Self, Box<dyn Error>> {
let (client, conn) = connect(&pg_url.parse()?).await?;
spawn(conn);
Ok(Self {pg: Arc::new(client)})
}
}
async fn query(ctx: &mut Context<State>) -> roa::Result {
let id: u32 = ctx.must_query("id")?.parse()?;
match ctx.pg.query_opt("SELECT * FROM user WHERE id=$1", &[&id]).await? {
Some(row) => {
let value: String = row.get(0);
ctx.write(value);
Ok(())
}
None => throw!(StatusCode::NOT_FOUND),
}
}
#[async_std::main]
async fn main() -> Result<(), Box<dyn Error>> {
let url = "postgres://fred:secret@localhost/test";
let state = State::new(url).await?;
App::new(state)
.gate(query_parser)
.end(query)
.listen("127.0.0.1:0", |addr| {
println!("Server is listening on {}", addr)
})?.await?;
Ok(())
}
Dependencies
~24–37MB
~705K SLoC