1pub mod config;
2mod errors;
3pub mod routes;
4
5use log::LevelFilter;
6use sqlx::postgres::{PgConnectOptions, PgPoolOptions};
7use sqlx::{ConnectOptions, Pool, Postgres};
8use url::{ParseError, Url};
9
10pub async fn connect(url: &str) -> Result<Pool<Postgres>, errors::PgUIAPIError> {
12 let options = conn_options(url)?;
13 let pgp = PgPoolOptions::new()
14 .acquire_timeout(std::time::Duration::from_secs(10))
15 .max_connections(5)
16 .connect_with(options)
17 .await?;
18 Ok(pgp)
19}
20
21pub fn conn_options(url: &str) -> Result<PgConnectOptions, ParseError> {
23 let parsed = Url::parse(url)?;
25 let mut options = PgConnectOptions::new()
26 .host(parsed.host_str().ok_or(ParseError::EmptyHost)?)
27 .port(parsed.port().ok_or(ParseError::InvalidPort)?)
28 .username(parsed.username())
29 .password(parsed.password().ok_or(ParseError::IdnaError)?);
30 options.log_statements(LevelFilter::Debug);
31 Ok(options)
32}