diff --git a/src/configure.rs b/src/configure.rs index 58b730ca..aff27f57 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::().is_ok() { + updated_values.insert( + keys[1].to_string(), + Value::Boolean(value.parse::().unwrap()), + ); + } else if value.parse::().is_ok() { + updated_values.insert( + keys[1].to_string(), + Value::Integer(value.parse::().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 1ae1eca0..c3d1d47c 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()