summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatan Kushner <hello@matchai.me>2019-04-15 11:40:18 -0400
committerMatan Kushner <hello@matchai.me>2019-04-15 11:40:40 -0400
commitbca4a7079f0bd663b8cc4584dc92388ce6799c1f (patch)
tree57891c9b1af75e907300535312bb883ac3185c99 /src
parent71cac5bd1fb09909dde64bbcf3ee4a31fb29be4f (diff)
Fix bug in path truncation
Paths with 3 components would truncate to 2 despite the truncation length begin set to 3.
Diffstat (limited to 'src')
-rw-r--r--src/modules/directory.rs88
-rw-r--r--src/print.rs2
-rw-r--r--src/segment.rs37
3 files changed, 91 insertions, 36 deletions
diff --git a/src/modules/directory.rs b/src/modules/directory.rs
index d62a41f67..5f2174bd3 100644
--- a/src/modules/directory.rs
+++ b/src/modules/directory.rs
@@ -91,11 +91,11 @@ fn truncate(dir_string: String, length: usize) -> String {
let components = dir_string
.split(std::path::MAIN_SEPARATOR)
.collect::<Vec<&str>>();
- if components.len() < length {
+ if components.len() <= length {
return dir_string;
}
- let truncated_components = &components[..length];
+ let truncated_components = &components[components.len() - length..];
truncated_components.join(&std::path::MAIN_SEPARATOR.to_string())
}
@@ -103,45 +103,71 @@ fn truncate(dir_string: String, length: usize) -> String {
mod tests {
// TODO: Look into stubbing `env` so that tests can be run in parallel
use super::*;
- use clap::{App, Arg};
- use std::path::Path;
- #[test]
- fn truncate_home_dir() {
- let args = App::new("starship")
- .arg(Arg::with_name("status_code"))
- .get_matches_from(vec!["starship", "0"]);
+ // #[test]
+ // fn truncate_home_dir() {
+ // let args = App::new("starship")
+ // .arg(Arg::with_name("status_code"))
+ // .get_matches_from(vec!["starship", "0"]);
- let home_dir = dirs::home_dir().unwrap();
- env::set_current_dir(&home_dir).unwrap();
+ // let home_dir = dirs::home_dir().unwrap();
+ // env::set_current_dir(&home_dir).unwrap();
- let segment = segment(&args);
- // assert_eq!(segment.value, "~");
- }
+ // let segment = segment(&args).unwrap();
+ // assert_eq!(segment.output(), "~");
+ // }
- #[test]
- fn dont_truncate_non_home_dir() {
- let args = App::new("starship")
- .arg(Arg::with_name("status_code"))
- .get_matches_from(vec!["starship", "0"]);
+ // #[test]
+ // fn dont_truncate_non_home_dir() {
+ // let args = App::new("starship")
+ // .arg(Arg::with_name("status_code"))
+ // .get_matches_from(vec!["starship", "0"]);
+
+ // let root_dir = Path::new("/");
+ // env::set_current_dir(&root_dir).unwrap();
+
+ // let segment = segment(&args).unwrap();
+ // assert_eq!(segment.output(), "/");
+ // }
+
+ // #[test]
+ // fn do_not_canonicalize_paths() {
+ // let args = App::new("starship")
+ // .arg(Arg::with_name("status_code"))
+ // .get_matches_from(vec!["starship", "0"]);
- let root_dir = Path::new("/");
- env::set_current_dir(&root_dir).unwrap();
+ // let root_dir = Path::new("/var");
+ // env::set_current_dir(&root_dir).unwrap();
- let segment = segment(&args);
- // assert_eq!(segment.value, "/");
+ // let segment = segment(&args).unwrap();
+ // assert_eq!(segment.output(), "/var");
+ // }
+
+ #[test]
+ fn truncate_smaller_path_than_provided_length() {
+ let path = "~/starship";
+ let output = truncate(path.to_string(), 3);
+ assert_eq!(output, "~/starship")
}
#[test]
- fn do_not_canonicalize_paths() {
- let args = App::new("starship")
- .arg(Arg::with_name("status_code"))
- .get_matches_from(vec!["starship", "0"]);
+ fn truncate_same_path_as_provided_length() {
+ let path = "~/starship/engines";
+ let output = truncate(path.to_string(), 3);
+ assert_eq!(output, "~/starship/engines")
+ }
- let root_dir = Path::new("/var");
- env::set_current_dir(&root_dir).unwrap();
+ #[test]
+ fn truncate_slightly_larger_path_then_provided_length() {
+ let path = "~/starship/engines/booster";
+ let output = truncate(path.to_string(), 3);
+ assert_eq!(output, "starship/engines/booster")
+ }
- let segment = segment(&args);
- // assert_eq!(segment.value, "/var");
+ #[test]
+ fn truncate_larger_path_than_provided_length() {
+ let path = "~/starship/engines/booster/rocket";
+ let output = truncate(path.to_string(), 3);
+ assert_eq!(output, "engines/booster/rocket")
}
}
diff --git a/src/print.rs b/src/print.rs
index cc1719199..a909e58bc 100644
--- a/src/print.rs
+++ b/src/print.rs
@@ -21,6 +21,6 @@ pub fn prompt(args: ArgMatches) {
.map(|module| modules::handle(module, &args)) // Compute segments
.flatten() // Remove segments set to `None`
.enumerate() // Turn segment into tuple with index
- .map(|(index, segment)| segment.output(index)) // Generate string outputs
+ .map(|(index, segment)| segment.output_index(index)) // Generate string outputs
.for_each(|segment_string| write!(handle, "{}", segment_string).unwrap());
}
diff --git a/src/segment.rs b/src/segment.rs
index a9a188f62..a56e1bf82 100644
--- a/src/segment.rs
+++ b/src/segment.rs
@@ -76,8 +76,37 @@ impl Segment {
/// Create a string with the formatted contents of a segment
///
/// Will recursively also format the prefix and suffix of the segment being
- /// stringified. Skips the prefix of the first segment.
- pub fn output(&self, index: usize) -> String {
+ /// stringified.
+ pub fn output(&self) -> String {
+ let Segment {
+ name: _name,
+ prefix,
+ value,
+ style,
+ suffix,
+ } = self;
+
+ let mut segment_string = String::new();
+
+ // Skip the prefix for the first segment
+ if let Some(prefix) = prefix {
+ segment_string += &prefix.output()
+ }
+
+ segment_string += &style.paint(value).to_string();
+
+ if let Some(suffix) = suffix {
+ segment_string += &suffix.output();
+ }
+
+ segment_string
+ }
+
+ /// Create a string with the formatted contents of a segment while skipping the first segment.
+ ///
+ /// Will recursively also format the prefix and suffix of the segment being
+ /// stringified.
+ pub fn output_index(&self, index: usize) -> String {
let Segment {
name: _name,
prefix,
@@ -91,14 +120,14 @@ impl Segment {
// Skip the prefix for the first segment
if index != 0 {
if let Some(prefix) = prefix {
- segment_string += &prefix.output(index)
+ segment_string += &prefix.output_index(index)
}
}
segment_string += &style.paint(value).to_string();
if let Some(suffix) = suffix {
- segment_string += &suffix.output(index);
+ segment_string += &suffix.output();
}
segment_string