use clap::{Args, Parser, Subcommand};
#[path = "../bundle/backend.rs"]
pub mod backend;
mod daemon;
mod log;
mod server;
mod store;
mod ui;
#[derive(Parser)]
#[command(name = "lgtm", version, about)]
struct Cli {
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand)]
enum Command {
Up(Up),
Down,
Status {
#[arg(long)]
json: bool,
},
Review {
#[arg(long, default_value_t = 8080)]
port: u16,
#[arg(long)]
no_open: bool,
},
#[command(hide = true)]
Serve {
#[arg(long, default_value_t = 8080)]
port: u16,
#[arg(long)]
daemonize: bool,
},
}
#[derive(Args)]
struct Up {
#[arg(long, default_value_t = 8080)]
port: u16,
#[arg(long)]
foreground: bool,
#[arg(long)]
no_open: bool,
}
fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
let store = store::Store::new()?;
if let Command::Serve {
daemonize: true, ..
} = cli.command
{
daemon::detach(&store)?;
}
if matches!(cli.command, Command::Serve { .. })
|| matches!(&cli.command, Command::Up(options) if options.foreground)
{
log::init(&store)?;
}
tokio::runtime::Runtime::new()?.block_on(async {
match cli.command {
Command::Up(options) if options.foreground => {
server::serve(options.port, &store, false).await
}
Command::Up(options) => daemon::up(options.port, !options.no_open, &store).await,
Command::Down => daemon::down(&store).await,
Command::Status { json } => daemon::status(&store, json).await,
Command::Review { port, no_open } => {
ui::open_review_ui_at_path(&std::env::current_dir()?, port, !no_open, &store).await
}
Command::Serve { port, daemonize } => server::serve(port, &store, daemonize).await,
}
})
}