warren-cli 0.1.6

Install any CLI tool unlimited times. Every instance is its own world.
use anyhow::{Context, Result, bail};
use flate2::Compression;
use flate2::write::GzEncoder;
use std::path::Path;

use crate::config::WarrenConfig;
use crate::instance::InstanceLayout;
use crate::ui::theme::Theme;

pub async fn execute(
    config: &WarrenConfig,
    theme: &Theme,
    alias: &str,
    out: Option<&Path>,
) -> Result<()> {
    let layout = InstanceLayout::new(&config.paths.instances_dir, alias);
    if !layout.exists() {
        bail!("instance '{}' not found", alias);
    }
    let output_path = out.map(|p| p.to_path_buf()).unwrap_or_else(|| {
        std::env::current_dir()
            .unwrap()
            .join(format!("{}.warren.tar.gz", alias))
    });
    theme.step(
        "📦",
        &format!("Exporting {} to {}", alias, output_path.display()),
    );
    let file = std::fs::File::create(&output_path)
        .with_context(|| format!("failed to create archive {}", output_path.display()))?;
    let enc = GzEncoder::new(file, Compression::default());
    let mut tar = tar::Builder::new(enc);
    tar.append_dir_all(alias, &layout.root)
        .with_context(|| format!("failed to create archive for instance '{}'", alias))?;
    tar.finish()?;
    theme.success(&format!("Exported: {}", output_path.display()));
    Ok(())
}