use anyhow::Result;
use clap::{Arg, Command};
use crossterm::{
event::{DisableMouseCapture, EnableMouseCapture},
execute,
terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};
use gcp_snap_crab::{
app::App,
gcp::GcpClient,
ui::run_app,
};
use ratatui::{backend::CrosstermBackend, Terminal};
use std::io;
#[tokio::main]
async fn main() -> Result<()> {
let matches = Command::new("GCP SQL Backup Restore")
.version(env!("CARGO_PKG_VERSION"))
.about("Interactive GCP SQL Instance Backup Restore Tool")
.arg(
Arg::new("dry-run")
.long("dry-run")
.help("Run in dry-run mode (simulate operations without executing)")
.action(clap::ArgAction::SetTrue),
)
.get_matches();
let dry_run_mode = matches.get_flag("dry-run");
run_tui_app(dry_run_mode).await?;
Ok(())
}
async fn run_tui_app(dry_run_mode: bool) -> Result<()> {
enable_raw_mode()?;
let mut stdout = io::stdout();
execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
let backend = CrosstermBackend::new(stdout);
let mut terminal = Terminal::new(backend)?;
let gcp_client = GcpClient::new();
let app = App::new(Box::new(gcp_client), dry_run_mode);
let res = run_app(&mut terminal, app).await;
disable_raw_mode()?;
execute!(
terminal.backend_mut(),
LeaveAlternateScreen,
DisableMouseCapture
)?;
terminal.show_cursor()?;
if let Err(err) = res {
println!("{err:?}");
}
Ok(())
}