tigen 0.1.0

Toolbox image builder (tigen) is a simple utility to create oci images to for creating [toolbox](https://github.com/containers/toolbox) sessions.
Documentation
pub trait PackageManager {
    fn install<'a>(&'a self, packages: impl Iterator<Item = &'a str>) -> Vec<&'a str>;
    fn update(&self) -> Vec<&str>;
    fn upgrade(&self) -> Vec<&str>;
}

#[derive(Default, Debug, Clone)]
pub struct Apt {}

impl PackageManager for Apt {
    fn install<'a>(&'a self, packages: impl Iterator<Item = &'a str>) -> Vec<&'a str> {
        let install_command = vec!["apt", "install", "-y"];
        install_command.into_iter().chain(packages).collect()
    }

    fn update(&self) -> Vec<&str> {
        vec!["apt", "update", "-y"]
    }

    fn upgrade(&self) -> Vec<&str> {
        vec!["apt", "upgrade", "-y"]
    }
}

#[derive(Default, Debug, Clone)]
pub struct Pacman {}

impl PackageManager for Pacman {
    fn install<'a>(&self, packages: impl Iterator<Item = &'a str>) -> Vec<&'a str> {
        let install_command = vec!["pacman", "-S", "--noconfirm"];
        install_command.into_iter().chain(packages).collect()
    }

    fn update(&self) -> Vec<&str> {
        vec!["pacman", "-Syy", "--noconfirm"]
    }

    fn upgrade(&self) -> Vec<&str> {
        vec!["pacman", "-Su", "--noconfirm"]
    }
}

#[derive(Default, Debug, Clone)]
pub struct Zypper {}

impl PackageManager for Zypper {
    fn install<'a>(&self, packages: impl Iterator<Item = &'a str>) -> Vec<&'a str> {
        let install_command = vec!["zypper", "install", "--non-interactive"];
        install_command.into_iter().chain(packages).collect()
    }

    fn update(&self) -> Vec<&str> {
        vec!["zypper", "refresh", "--non-interactive"]
    }

    fn upgrade(&self) -> Vec<&str> {
        vec!["zypper", "update", "--non-interactive"]
    }
}

#[derive(Default, Debug, Clone)]
pub struct Dnf {}

impl PackageManager for Dnf {
    fn install<'a>(&self, packages: impl Iterator<Item = &'a str>) -> Vec<&'a str> {
        let install_command = vec!["dnf", "install", "-y"];
        install_command.into_iter().chain(packages).collect()
    }

    fn update(&self) -> Vec<&str> {
        vec!["dnf", "check-update", "-y"]
    }

    fn upgrade(&self) -> Vec<&str> {
        vec!["dnf", "upgrade", "-y"]
    }
}