Files
sus-manager/ui/src/cli/mod.rs
2025-12-14 21:34:06 +08:00

64 lines
1.6 KiB
Rust
Executable File

mod folder;
mod sync;
use crate::{app, helpers};
use clap::{command, Parser};
use color_eyre::Result;
use ratatui::crossterm;
use crate::cli::folder::FolderCommand;
use crate::cli::sync::DLSiteCommand;
#[derive(Parser, Debug)]
enum CliSubCommand {
Folder(FolderCommand),
#[command(name = "dlsite")]
DLSite(DLSiteCommand),
}
#[derive(Parser, Debug)]
#[command(version, about)]
pub struct Cli {
#[command(subcommand)]
subcommand: Option<CliSubCommand>,
}
impl Cli {
pub async fn run(&self) -> Result<()> {
helpers::initialize_folders().await?;
if self.subcommand.is_none() {
return self.start_tui().await;
}
if let Some(sub_command) = &self.subcommand {
return sub_command.handle().await;
}
Ok(())
}
async fn start_tui(&self) -> Result<()> {
crossterm::terminal::enable_raw_mode()?;
let mut terminal = ratatui::init();
struct TuiCleanup;
impl Drop for TuiCleanup {
fn drop(&mut self) {
ratatui::restore();
let _ = crossterm::terminal::disable_raw_mode();
}
}
let _cleanup = TuiCleanup;
let app = app::App::create().await?;
let result = app.run(&mut terminal).await;
ratatui::restore();
crossterm::terminal::disable_raw_mode()?;
result
}
}
impl CliSubCommand {
pub async fn handle(&self) -> Result<()> {
match self {
CliSubCommand::Folder(cmd) => cmd.subcommand.handle().await,
CliSubCommand::DLSite(cmd) => cmd.subcommand.handle().await,
}
}
}