use anyhow::{Context, Result};
use clap::{self, Parser};

#[derive(Parser)]
struct CommandLine {
    #[clap(subcommand)]
    command: Subcommand,
}

#[derive(clap::Subcommand)]
enum Subcommand {
    Generate(installer::Generator),
    Combine(installer::Combiner),
    Script(installer::Scripter),
    Tarball(installer::Tarballer),
}

fn main() -> Result<()> {
    let command_line = CommandLine::parse();
    match command_line.command {
        Subcommand::Combine(combiner) => combiner.run().context("failed to combine installers")?,
        Subcommand::Generate(generator) => generator.run().context("failed to generate installer")?,
        Subcommand::Script(scripter) => scripter.run().context("failed to generate installation script")?,
        Subcommand::Tarball(tarballer) => tarballer.run().context("failed to generate tarballs")?,
    }
    Ok(())
}
