From 92a7518975c6bc4b2f9b9c6c12c458b24e8cfaf5 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Fri, 30 Aug 2024 20:37:08 -0400 Subject: Store state in sqlite. Default to .hi in the cwd. --- src/cli.rs | 31 ++++++++++++++++++++++++++----- src/main.rs | 8 +++----- 2 files changed, 29 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/cli.rs b/src/cli.rs index b165677..0880020 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -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 = std::result::Result>; #[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 { + async fn listener(&self) -> io::Result { 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 { + 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 { +fn started_msg(listener: &net::TcpListener) -> io::Result { let local_addr = listener.local_addr()?; Ok(format!("listening on http://{local_addr}/")) } diff --git a/src/main.rs b/src/main.rs index 43c4e48..d199a74 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,9 @@ -use std::io; - use clap::Parser; -use hi::cli::Args; +use hi::cli; #[tokio::main] -async fn main() -> io::Result<()> { - let args = Args::parse(); +async fn main() -> cli::Result<()> { + let args = cli::Args::parse(); args.run().await } -- cgit v1.2.3