summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-08-30 20:37:08 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-08-30 20:37:08 -0400
commit92a7518975c6bc4b2f9b9c6c12c458b24e8cfaf5 (patch)
treef0bc1dedad045f360576c169b7482e73f6820eaf /src
parentf26dd0d662d8fc33108d072031329e707f54300b (diff)
Store state in sqlite. Default to .hi in the cwd.
Diffstat (limited to 'src')
-rw-r--r--src/cli.rs31
-rw-r--r--src/main.rs8
2 files changed, 29 insertions, 10 deletions
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<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}/"))
}
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
}