langenv 0.0.2

langenv aims to be a cross-platform package manager for Linux, macOS, and Windows.
Documentation
extern crate clap;
extern crate directories;
extern crate flate2;
// extern crate fs_extra;
extern crate reqwest;
extern crate semver;
extern crate strum;
extern crate tar;
extern crate toml;
extern crate url;
extern crate zip;

use clap::Clap;
// use fs_extra::dir::copy;
use langenv::langenv::*;
use std::path::Path;

/// This doc string acts as a help message when the user runs '--help'
/// as do all doc strings on fields
#[derive(Clap)]
#[clap(author = "Vyas Nellutla <vyasnellutla@gmail.com>")]
struct Opts {
	// /// Sets a custom config file. Could have been an Option<T> with no default too
	// #[clap(short, long, default_value = "default.conf")]
	// config: String,
	// /// Some input. Because this isn't an Option<T> it's required to be used
	// input: String,
	// /// A level of verbosity, and can be used multiple times
	// #[clap(short, long, parse(from_occurrences))]
	// verbose: i32,
	#[clap(subcommand)]
	subcmd: SubCommand,
}

#[derive(Clap)]
enum SubCommand {
	Install(Install),
	List(List),
	Info(Info),
	Setup(Setup),
}

/// Install a package
#[derive(Clap)]
struct Install {
	// /// Print debug info
	// #[clap(short)]
	// debug: bool,
	package: String,
}

/// Get information about a package
#[derive(Clap)]
struct Info {
	// /// Print debug info
	// #[clap(short)]
	// debug: bool,
	package: Option<String>,
}

/// Search for a package
#[derive(Clap)]
struct Setup {}

/// List available packages
#[derive(Clap)]
struct List {}

fn main() -> Result<(), std::io::Error> {
	let langenv: Langenv = Langenv::new(Path::new("./repos"))?;
	println!("{:?}\n", langenv);

	// TODO: Convert to unit tests
	// for tool in &langenv.repo.tools {
	// 	for release in &tool.releases {
	// 		for package in &release.packages {
	// 			if package.platform == langenv.platform
	// 				&& package.cpu_architecture == langenv.cpu_architecture
	// 			{
	// 				install_package(&langenv, &tool, &release, &package)?;
	// 			}
	// 		}
	// 	}
	// 	println!();
	// }

	let opts: Opts = Opts::parse();
	match opts.subcmd {
		SubCommand::Install(Install { package }) => {
			println!("User requested to install {:?}", package);
			// TODO: install_package(&langenv, &tool, &release, &package)?;
		}
		SubCommand::Info(Info { package }) => {
			match package {
				Some(package) => {
					println!("User wants to get information about {:?}", package);
					// TODO
				}
				None => {
					println!("Printing Information about langenv & host system");
					// TODO
				}
			}
		}
		SubCommand::List(_) => {
			println!("User requested a list of all available packages:");
			for tool in &langenv.repo.tools {
				println!("- {}", &tool.name);
			}
			println!();
		}
		SubCommand::Setup(_) => println!("User requested to setup the current user to use langenv"),
	}

	Ok(())
}