diff options
Diffstat (limited to 'src/cli.rs')
| -rw-r--r-- | src/cli.rs | 31 |
1 files changed, 26 insertions, 5 deletions
@@ -1,7 +1,12 @@ use std::io; +use std::str::FromStr; use axum::{routing::get, Router}; use clap::Parser; +use sqlx::sqlite::{SqliteConnectOptions, SqlitePool, SqlitePoolOptions}; +use tokio::net; + +pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>; #[derive(Parser)] pub struct Args { @@ -10,11 +15,18 @@ pub struct Args { #[arg(short, long, env, default_value_t = 64209)] port: u16, + + #[arg(short, long, env, default_value = "sqlite://.hi")] + database_url: String, } impl Args { - pub async fn run(self) -> io::Result<()> { - let app = Router::new().route("/", get(hello)); + pub async fn run(self) -> Result<()> { + let pool = self.pool().await?; + + sqlx::migrate!().run(&pool).await?; + + let app = Router::new().route("/", get(hello)).with_state(pool); let listener = self.listener().await?; let started_msg = started_msg(&listener)?; @@ -26,18 +38,27 @@ impl Args { Ok(()) } - async fn listener(&self) -> io::Result<tokio::net::TcpListener> { + async fn listener(&self) -> io::Result<net::TcpListener> { let listen_addr = self.listen_addr(); let listener = tokio::net::TcpListener::bind(listen_addr).await?; Ok(listener) } - fn listen_addr(&self) -> impl tokio::net::ToSocketAddrs + '_ { + fn listen_addr(&self) -> impl net::ToSocketAddrs + '_ { (self.address.as_str(), self.port) } + + async fn pool(&self) -> sqlx::Result<SqlitePool> { + let options = SqliteConnectOptions::from_str(&self.database_url)? + .create_if_missing(true) + .optimize_on_close(true, /* analysis_limit */ None); + + let pool = SqlitePoolOptions::new().connect_with(options).await?; + Ok(pool) + } } -fn started_msg(listener: &tokio::net::TcpListener) -> io::Result<String> { +fn started_msg(listener: &net::TcpListener) -> io::Result<String> { let local_addr = listener.local_addr()?; Ok(format!("listening on http://{local_addr}/")) } |
