diff options
author | John Letey <johnletey@gmail.com> | 2020-04-26 14:58:39 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-26 15:58:39 +0200 |
commit | a3fef5becf82481fb91f29799d4d53d9b3711a65 (patch) | |
tree | 8a141c6dd8e12466e86d986634e96981c13698e3 | |
parent | decd4e2a5d74175c9bd6370a1cf9980b18cb6970 (diff) |
feat: Modify config keys from shell (#1095)
* feat: Modify config keys from shell
* chore: Fix clippy
* refactor: Add `configure` as alias
* chore: Remove redundant code
* fix: Soft error if user doesn't pass in valid key
* feat: Support integers and booleans
* chore: Fix clippy
* refactor: Use exit instead of abort
Co-Authored-By: Thomas O'Donnell <andytom@users.noreply.github.com>
Co-authored-by: Thomas O'Donnell <andytom@users.noreply.github.com>
-rw-r--r-- | src/configure.rs | 54 | ||||
-rw-r--r-- | src/main.rs | 23 |
2 files changed, 75 insertions, 2 deletions
diff --git a/src/configure.rs b/src/configure.rs index 58b730cac..aff27f570 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -1,10 +1,64 @@ use std::env; use std::ffi::OsString; use std::io::ErrorKind; +use std::process; use std::process::Command; +use starship::config::StarshipConfig; +use std::fs::File; +use std::io::Write; +use toml::map::Map; +use toml::Value; + const STD_EDITOR: &str = "vi"; +pub fn update_configuration(name: &str, value: &str) { + let config_path = get_config_path(); + + let keys: Vec<&str> = name.split('.').collect(); + if keys.len() != 2 { + log::error!("Please pass in a config key with a '.'"); + process::exit(1); + } + + let starship_config = StarshipConfig::initialize(); + let mut config = starship_config + .config + .expect("Failed to load starship config"); + + if let Some(table) = config.as_table_mut() { + if !table.contains_key(keys[0]) { + table.insert(keys[0].to_string(), Value::Table(Map::new())); + } + + if let Some(values) = table.get(keys[0]).unwrap().as_table() { + let mut updated_values = values.clone(); + + if value.parse::<bool>().is_ok() { + updated_values.insert( + keys[1].to_string(), + Value::Boolean(value.parse::<bool>().unwrap()), + ); + } else if value.parse::<i64>().is_ok() { + updated_values.insert( + keys[1].to_string(), + Value::Integer(value.parse::<i64>().unwrap()), + ); + } else { + updated_values.insert(keys[1].to_string(), Value::String(value.to_string())); + } + + table.insert(keys[0].to_string(), Value::Table(updated_values)); + } + + let config_str = + toml::to_string_pretty(&table).expect("Failed to serialize the config to string"); + File::create(&config_path) + .and_then(|mut file| file.write_all(config_str.as_ref())) + .expect("Error writing starship config"); + } +} + pub fn edit_configuration() { let config_path = get_config_path(); let editor_cmd = get_editor(); diff --git a/src/main.rs b/src/main.rs index 1ae1eca0a..c3d1d47cb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -116,7 +116,18 @@ fn main() { .arg(&keymap_arg) .arg(&jobs_arg), ) - .subcommand(SubCommand::with_name("configure").about("Edit the starship configuration")) + .subcommand( + SubCommand::with_name("config") + .alias("configure") + .about("Edit the starship configuration") + .arg( + Arg::with_name("name") + .help("Configuration key to edit") + .required(false) + .requires("value"), + ) + .arg(Arg::with_name("value").help("Value to place into that key")), + ) .subcommand(SubCommand::with_name("bug-report").about( "Create a pre-populated GitHub issue with information about your configuration", )) @@ -152,7 +163,15 @@ fn main() { print::module(module_name, sub_m.clone()); } } - ("configure", Some(_)) => configure::edit_configuration(), + ("config", Some(sub_m)) => { + if let Some(name) = sub_m.value_of("name") { + if let Some(value) = sub_m.value_of("value") { + configure::update_configuration(name, value) + } + } else { + configure::edit_configuration() + } + } ("bug-report", Some(_)) => bug_report::create(), ("time", _) => { match SystemTime::now() |