gcp-snap-crab 0.3.0

A minimalist, powerful, terminal-based GCP backup and restore tool written in Rust
Documentation
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 the application in restore mode (with or without dry-run)
    run_tui_app(dry_run_mode).await?;

    Ok(())
}

async fn run_tui_app(dry_run_mode: bool) -> Result<()> {
    // Setup terminal
    enable_raw_mode()?;
    let mut stdout = io::stdout();
    execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
    let backend = CrosstermBackend::new(stdout);
    let mut terminal = Terminal::new(backend)?;

    // Create app and run it
    let gcp_client = GcpClient::new();
    let app = App::new(Box::new(gcp_client), dry_run_mode);
    let res = run_app(&mut terminal, app).await;

    // Restore terminal
    disable_raw_mode()?;
    execute!(
        terminal.backend_mut(),
        LeaveAlternateScreen,
        DisableMouseCapture
    )?;
    terminal.show_cursor()?;

    if let Err(err) = res {
        println!("{err:?}");
    }

    Ok(())
}