summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndrew Dassonville <dassonville.andrew@gmail.com>2019-07-28 18:05:13 -0700
committerMatan Kushner <hello@matchai.me>2019-07-28 21:05:13 -0400
commit5dbf4381acd1fd8dbb2905828c3fcc6515d850cf (patch)
tree36a13ea34b8af9c0f6c5fa30c8ae9d7c3835f0de /src
parentab46710fc47891a80eb1b6073616c95a1acc92bd (diff)
feat: Allow directory truncation length to be configured (#120)
This allows the directory truncation length to be configured. Previously, it was hard-coded to truncate to 3 parent directories.
Diffstat (limited to 'src')
-rw-r--r--src/config.rs34
-rw-r--r--src/module.rs10
-rw-r--r--src/modules/directory.rs8
3 files changed, 50 insertions, 2 deletions
diff --git a/src/config.rs b/src/config.rs
index d5861b9f0..c06541eeb 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -12,6 +12,7 @@ pub trait Config {
// Config accessor methods
fn get_as_bool(&self, key: &str) -> Option<bool>;
fn get_as_str(&self, key: &str) -> Option<&str>;
+ fn get_as_i64(&self, key: &str) -> Option<i64>;
// Internal implementation for accessors
fn get_config(&self, key: &str) -> Option<&toml::value::Value>;
@@ -129,6 +130,23 @@ impl Config for Table {
str_value
}
+
+ /// Get a key from a module's configuration as an integer
+ fn get_as_i64(&self, key: &str) -> Option<i64> {
+ let value = self.get_config(key)?;
+ let i64_value = value.as_integer();
+
+ if i64_value.is_none() {
+ log::debug!(
+ "Expected \"{}\" to be an integer. Instead received {} of type {}.",
+ key,
+ value,
+ value.type_str()
+ );
+ }
+
+ i64_value
+ }
}
mod tests {
@@ -165,4 +183,20 @@ mod tests {
table.insert(String::from("boolean"), toml::value::Value::Boolean(true));
assert_eq!(table.get_as_str("boolean"), None);
}
+
+ #[test]
+ fn table_get_as_i64() {
+ let mut table = toml::value::Table::new();
+
+ // Use with integer value
+ table.insert(String::from("integer"), toml::value::Value::Integer(82));
+ assert_eq!(table.get_as_i64("integer"), Some(82));
+
+ // Use with string value
+ table.insert(
+ String::from("string"),
+ toml::value::Value::String(String::from("82")),
+ );
+ assert_eq!(table.get_as_bool("string"), None);
+ }
}
diff --git a/src/module.rs b/src/module.rs
index af985ea3a..526345b95 100644
--- a/src/module.rs
+++ b/src/module.rs
@@ -99,6 +99,16 @@ impl<'a> Module<'a> {
fn config_value(&self, key: &str) -> Option<&str> {
self.config.and_then(|config| config.get_as_str(key))
}
+
+ /// Get a module's config value as an int
+ pub fn config_value_i64(&self, key: &str) -> Option<i64> {
+ self.config.and_then(|config| config.get_as_i64(key))
+ }
+
+ /// Get a module's config value as a bool
+ pub fn config_value_bool(&self, key: &str) -> Option<bool> {
+ self.config.and_then(|config| config.get_as_bool(key))
+ }
}
impl<'a> fmt::Display for Module<'a> {
diff --git a/src/modules/directory.rs b/src/modules/directory.rs
index 61937e751..a14f1c204 100644
--- a/src/modules/directory.rs
+++ b/src/modules/directory.rs
@@ -15,12 +15,16 @@ use super::{Context, Module};
/// Paths will be limited in length to `3` path components by default.
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
const HOME_SYMBOL: &str = "~";
- const DIR_TRUNCATION_LENGTH: usize = 3;
+ const DIR_TRUNCATION_LENGTH: i64 = 3;
let module_color = Color::Cyan.bold();
let mut module = context.new_module("directory")?;
module.set_style(module_color);
+ let truncation_length = module
+ .config_value_i64("truncation_length")
+ .unwrap_or(DIR_TRUNCATION_LENGTH);
+
let current_dir = &context.current_dir;
log::debug!("Current directory: {:?}", current_dir);
@@ -38,7 +42,7 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
}
// Truncate the dir string to the maximum number of path components
- let truncated_dir_string = truncate(dir_string, DIR_TRUNCATION_LENGTH);
+ let truncated_dir_string = truncate(dir_string, truncation_length as usize);
module.new_segment("path", &truncated_dir_string);
module.get_prefix().set_value("in ");