summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Letey <johnletey@gmail.com>2020-04-26 14:58:39 +0100
committerGitHub <noreply@github.com>2020-04-26 15:58:39 +0200
commita3fef5becf82481fb91f29799d4d53d9b3711a65 (patch)
tree8a141c6dd8e12466e86d986634e96981c13698e3
parentdecd4e2a5d74175c9bd6370a1cf9980b18cb6970 (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.rs54
-rw-r--r--src/main.rs23
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()