use crate::argparse;
use crate::logger;
use preferences;
use preferences::Preferences;
use std::env as stdEnv;
use std::io::stdin;
const APP_INFO: preferences::AppInfo = preferences::AppInfo {
name: "reups",
author: "Reups Community",
};
const PREF_KEY: &str = "saved/environments";
pub fn env_command(sub_args: &argparse::ArgMatches, _main_args: &argparse::ArgMatches) {
let mut env_command = EnvCommandImpl::new(sub_args, _main_args);
env_command.run();
}
struct EnvCommandImpl<'a> {
sub_args: &'a argparse::ArgMatches<'a>,
_main_args: &'a argparse::ArgMatches<'a>,
current_commands: Vec<String>,
name: String,
saved_envs: preferences::PreferencesMap<Vec<String>>,
}
impl<'a> EnvCommandImpl<'a> {
fn new(
sub_args: &'a argparse::ArgMatches<'a>,
_main_args: &'a argparse::ArgMatches<'a>,
) -> EnvCommandImpl<'a> {
logger::build_logger(sub_args, false);
let current_commands = match stdEnv::var("REUPS_HISTORY") {
Ok(existing) => existing.split("|").map(|x| String::from(x)).collect(),
_ => vec![],
};
let name = {
if sub_args.is_present("name") {
String::from(sub_args.value_of("name").unwrap())
} else {
String::from("default")
}
};
let saved_envs = preferences::PreferencesMap::<Vec<String>>::load(&APP_INFO, PREF_KEY);
let saved_envs = {
if saved_envs.is_ok() {
crate::debug!("saved_envs loaded existing env");
saved_envs.unwrap()
} else {
crate::debug!("Existing env was not loaded, create and use new env store");
crate::warn!("No existing env store could be found create a new one? (y/N)");
let mut s = String::new();
stdin()
.read_line(&mut s)
.expect("Did not enter a correct option");
if let Some('\n') = s.chars().next_back() {
s.pop();
}
if let Some('\r') = s.chars().next_back() {
s.pop();
}
if s == "y" || s == "Y" {
crate::warn!("Creating new env store");
preferences::PreferencesMap::<Vec<String>>::new()
} else {
exit_with_message!("No env store found or created, exiting");
}
}
};
EnvCommandImpl {
sub_args,
_main_args,
current_commands,
name,
saved_envs: saved_envs,
}
}
fn run(&mut self) {
match self.sub_args.value_of("command").unwrap() {
"save" => self.run_save(),
"restore" => self.run_restore(),
"delete" => self.run_delete(),
"list" => self.run_list(),
_ => (),
}
}
fn run_save(&mut self) {
self.saved_envs
.insert(self.name.clone(), self.current_commands.clone());
let save_result = self.saved_envs.save(&APP_INFO, PREF_KEY);
save_result.expect("There was a problem saving the current env");
}
fn run_restore(&self) {
let env_list_option = &self.saved_envs.get(&self.name);
let env_list = match env_list_option {
Some(list) => list,
None => {
exit_with_message!(format!(
"Cannot find environment {}. Use reups env list to see saved environments",
&self.name
));
}
};
let app = argparse::build_cli();
for command in *env_list {
let args = app.clone().get_matches_from(command.split(" "));
match args.subcommand() {
("setup", Some(_)) => {
println!("eval $({});", command);
}
_ => {
exit_with_message!(format!("Problem restoring environment {}", &self.name));
}
};
}
}
fn run_delete(&mut self) {
if self.name == "default" {
exit_with_message!("Cannot delete default save");
}
self.saved_envs.remove(&self.name);
let save_result = self.saved_envs.save(&APP_INFO, PREF_KEY);
if !save_result.is_ok() {
exit_with_message!("There was a problem deleting the environment");
}
}
fn run_list(&self) {
println!("Environments Found:");
for (k, v) in &self.saved_envs {
println!("{}", k);
crate::info!("{:?}", v);
}
}
}