feat: started clap cli interface

This commit is contained in:
Jef Roosens 2025-02-23 14:08:22 +01:00
parent 166ae172d0
commit b343fbccea
No known key found for this signature in database
GPG key ID: 21FD3D77D56BAF49
5 changed files with 216 additions and 25 deletions

32
src/cli/mod.rs Normal file
View file

@ -0,0 +1,32 @@
mod serve;
use std::path::PathBuf;
use clap::{Parser, Subcommand};
#[derive(Parser)]
pub struct Cli {
#[arg(
long = "data",
default_value = "./data",
value_name = "DATA_DIR",
env = "OTTER_DATA_DIR"
)]
pub data_dir: PathBuf,
#[command(subcommand)]
pub cmd: Command,
}
#[derive(Subcommand)]
pub enum Command {
Serve(serve::ServeCommand),
}
impl Cli {
pub fn run(&self) -> u8 {
match &self.cmd {
Command::Serve(cmd) => cmd.run(self),
}
}
}

56
src/cli/serve.rs Normal file
View file

@ -0,0 +1,56 @@
use clap::Args;
use crate::{db, server};
const DB_FILENAME: &str = "otter.sqlite3";
#[derive(Args)]
pub struct ServeCommand {
#[arg(
short,
long,
default_value = "127.0.0.1",
value_name = "DOMAIN",
env = "OTTER_DOMAIN"
)]
domain: String,
#[arg(
short,
long,
default_value = "8080",
value_name = "PORT",
env = "OTTER_PORT"
)]
port: u16,
}
impl ServeCommand {
pub fn run(&self, cli: &super::Cli) -> u8 {
tracing_subscriber::fmt::init();
tracing::info!("Initializing database and running migrations");
let pool = db::initialize_db(cli.data_dir.join(DB_FILENAME), true).unwrap();
let ctx = server::Context { pool };
let app = server::app().with_state(ctx);
let rt = tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.unwrap();
let address = format!("{}:{}", self.domain, self.port);
tracing::info!("Starting server on {address}");
rt.block_on(async {
let listener = tokio::net::TcpListener::bind(address).await.unwrap();
axum::serve(listener, app.into_make_service())
.await
.unwrap()
});
0
}
}