feat: started clap cli interface
This commit is contained in:
parent
166ae172d0
commit
b343fbccea
5 changed files with 216 additions and 25 deletions
32
src/cli/mod.rs
Normal file
32
src/cli/mod.rs
Normal 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
56
src/cli/serve.rs
Normal 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
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue