64 lines
1.6 KiB
Rust
Executable File
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,
|
|
}
|
|
}
|
|
}
|