diff --git a/src/main.rs b/src/main.rs index eb3db5a..d1b80d4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,8 @@ mod state; mod r#static; +use std::path::PathBuf; + use askama::Template; use askama_axum::{IntoResponse, Response}; use axum::{extract::State, http::StatusCode, routing::get, Router}; @@ -20,7 +22,12 @@ const VERSION: &str = concat!( #[derive(Debug, clap::Parser)] #[command(name = NAME, version = VERSION)] -struct Args {} +struct Args { + /// Path to the repo's tablejohn database. + db: PathBuf, + /// Path to the git repo. + repo: PathBuf, +} fn set_up_logging() { let filter = tracing_subscriber::filter::Builder::default() @@ -47,12 +54,13 @@ async fn index(State(db): State) -> Result { } async fn run() -> anyhow::Result<()> { + // Parse args before any logging starts let args = Args::parse(); set_up_logging(); info!("You are running {NAME} {VERSION}"); - let state = AppState::new().await?; + let state = AppState::new(&args.db).await?; let app = Router::new() .route("/", get(index)) diff --git a/src/state.rs b/src/state.rs index 5cecb40..e3d544e 100644 --- a/src/state.rs +++ b/src/state.rs @@ -1,5 +1,7 @@ //! Globally accessible application state. +use std::path::Path; + use axum::extract::FromRef; use sqlx::{ sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions, SqliteSynchronous}, @@ -7,8 +9,7 @@ use sqlx::{ }; // TODO Occasionally run PRAGMA optimize -// TODO Open db from path -async fn pool() -> sqlx::Result { +async fn pool(db_path: &Path) -> sqlx::Result { let options = SqliteConnectOptions::new() // https://www.sqlite.org/pragma.html#pragma_journal_mode .journal_mode(SqliteJournalMode::Wal) @@ -20,6 +21,7 @@ async fn pool() -> sqlx::Result { // https://www.sqlite.org/pragma.html#pragma_trusted_schema // The docs recommend always turning this off .pragma("trusted_schema", "false") + .filename(db_path) .create_if_missing(true) .optimize_on_close(true, None); @@ -36,7 +38,9 @@ pub struct AppState { } impl AppState { - pub async fn new() -> anyhow::Result { - Ok(Self { db: pool().await? }) + pub async fn new(db_path: &Path) -> anyhow::Result { + Ok(Self { + db: pool(db_path).await?, + }) } }