diff options
Diffstat (limited to 'src/modules/shlvl.rs')
-rw-r--r-- | src/modules/shlvl.rs | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/src/modules/shlvl.rs b/src/modules/shlvl.rs index 1e1e3cae0..48d22ec89 100644 --- a/src/modules/shlvl.rs +++ b/src/modules/shlvl.rs @@ -22,11 +22,20 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { let shlvl_str = &shlvl.to_string(); - let repeat_count = if config.repeat { + let mut repeat_count: usize = if config.repeat { shlvl.try_into().unwrap_or(1) } else { 1 }; + + if config.repeat_offset > 0 { + repeat_count = + repeat_count.saturating_sub(config.repeat_offset.try_into().unwrap_or(usize::MAX)); + if repeat_count == 0 { + return None; + } + } + let symbol = if repeat_count != 1 { Cow::Owned(config.symbol.repeat(repeat_count)) } else { @@ -219,4 +228,33 @@ mod tests { assert_eq!(expected, actual); } + + #[test] + fn repeat_offset() { + fn get_actual(shlvl: usize, repeat_offset: usize, threshold: usize) -> Option<String> { + ModuleRenderer::new("shlvl") + .config(toml::toml! { + [shlvl] + format = "[$symbol]($style)" + symbol = "~" + repeat = true + repeat_offset = repeat_offset + disabled = false + threshold = threshold + }) + .env(SHLVL_ENV_VAR, format!("{}", shlvl)) + .collect() + } + + assert_eq!( + get_actual(2, 0, 0), + Some(format!("{}", style().paint("~~"))) + ); + assert_eq!(get_actual(2, 1, 0), Some(format!("{}", style().paint("~")))); + assert_eq!(get_actual(2, 2, 0), None); // offset same as shlvl; hide + assert_eq!(get_actual(2, 3, 0), None); // offset larger than shlvl; hide + assert_eq!(get_actual(2, 1, 3), None); // high threshold; hide + // threshold not high enough; hide + assert_eq!(get_actual(2, 1, 2), Some(format!("{}", style().paint("~")))); + } } |