From 86953272a7f1471e9a3422a7543d97b953406df6 Mon Sep 17 00:00:00 2001 From: Izhak Jakov Date: Wed, 16 Mar 2022 16:05:13 -0400 Subject: [PATCH] fix(status): Make status module work even when the status is 0 (#3750) Co-authored-by: Izhak Jakov --- docs/config/README.md | 9 +++---- src/configs/status.rs | 2 +- src/modules/status.rs | 56 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 58 insertions(+), 9 deletions(-) diff --git a/docs/config/README.md b/docs/config/README.md index 7a5617de..7a160774 100644 --- a/docs/config/README.md +++ b/docs/config/README.md @@ -3083,7 +3083,7 @@ format = '[📦 \[$env\]]($style) ' ## Status The `status` module displays the exit code of the previous command. -The module will be shown only if the exit code is not `0`. +If $success_symbol is empty (default), the module will be shown only if the exit code is not `0`. The status code will cast to a signed 32-bit integer. ::: tip @@ -3103,7 +3103,7 @@ This module is not supported on nu shell. | ----------------------- | ----------------------------------------------------------------------------- | ------------------------------------------------------- | | `format` | `"[$symbol$status]($style) "` | The format of the module | | `symbol` | `"✖"` | The symbol displayed on program error | -| `success_symbol` | `"✔️"` | The symbol displayed on program success | +| `success_symbol` | `""` | The symbol displayed on program success | | `not_executable_symbol` | `"🚫"` | The symbol displayed when file isn't executable | | `not_found_symbol` | `"🔍"` | The symbol displayed when the command can't be found | | `sigint_symbol` | `"🧱"` | The symbol displayed on SIGINT (Ctrl + c) | @@ -3140,8 +3140,9 @@ This module is not supported on nu shell. [status] style = "bg:blue" -symbol = "🔴" -format = '[\[$symbol $common_meaning$signal_name$maybe_int\]]($style) ' +symbol = "🔴 " +success_symbol = "🟢 SUCCESS" +format = '[\[$symbol$common_meaning$signal_name$maybe_int\]]($style) ' map_symbol = true disabled = false ``` diff --git a/src/configs/status.rs b/src/configs/status.rs index dda5f819..9d6337eb 100644 --- a/src/configs/status.rs +++ b/src/configs/status.rs @@ -26,7 +26,7 @@ impl<'a> Default for StatusConfig<'a> { StatusConfig { format: "[$symbol$status]($style) ", symbol: "✖", - success_symbol: "✔️", + success_symbol: "", not_executable_symbol: "🚫", not_found_symbol: "🔍", sigint_symbol: "🧱", diff --git a/src/modules/status.rs b/src/modules/status.rs index a3ae4fea..43d21bfb 100644 --- a/src/modules/status.rs +++ b/src/modules/status.rs @@ -17,7 +17,7 @@ enum PipeStatusStatus<'a> { /// Creates a module with the status of the last command /// -/// Will display the status only if it is not 0 +/// Will display the status pub fn module<'a>(context: &'a Context) -> Option> { let mut module = context.new_module("status"); let config = StatusConfig::try_load(module.config); @@ -43,8 +43,9 @@ pub fn module<'a>(context: &'a Context) -> Option> { false => PipeStatusStatus::Disabled, }; - // Exit code is zero and pipestatus is all zero or disabled/missing + // Exit code is zero while success_symbol and pipestatus are all zero or disabled/missing if exit_code == "0" + && config.success_symbol.is_empty() && (match pipestatus_status { PipeStatusStatus::Pipe(ps) => ps.iter().all(|s| s == "0"), _ => true, @@ -176,7 +177,7 @@ fn status_common_meaning(ex: ExitCode) -> Option<&'static str> { return None; } match ex { - 0 => Some(""), + 0 => Some(""), // SUCCESS can be defined by $success_symbol if the user wishes too. 1 => Some("ERROR"), 2 => Some("USAGE"), 126 => Some("NOPERM"), @@ -228,13 +229,59 @@ mod tests { use crate::test::ModuleRenderer; #[test] - fn success_status() { + fn success_status_success_symbol_empty() { let expected = None; + // Status code 0 and success_symbol = "" + let actual = ModuleRenderer::new("status") + .config(toml::toml! { + [status] + success_symbol = "" + disabled = false + }) + .status(0) + .collect(); + assert_eq!(expected, actual); + + // Status code 0 and success_symbol is missing + let actual = ModuleRenderer::new("status") + .config(toml::toml! { + [status] + disabled = false + }) + .status(0) + .collect(); + assert_eq!(expected, actual); + + // No status code and success_symbol = "" + let actual = ModuleRenderer::new("status") + .config(toml::toml! { + [status] + success_symbol = "" + disabled = false + }) + .collect(); + assert_eq!(expected, actual); + + // No status code and success_symbol is missing + let actual = ModuleRenderer::new("status") + .config(toml::toml! { + [status] + disabled = false + }) + .collect(); + assert_eq!(expected, actual); + } + + #[test] + fn success_status_success_symbol_filled() { + let expected = Some(format!("{} ", Color::Red.bold().paint("✔️0"))); + // Status code 0 let actual = ModuleRenderer::new("status") .config(toml::toml! { [status] + success_symbol = "✔️" disabled = false }) .status(0) @@ -245,6 +292,7 @@ mod tests { let actual = ModuleRenderer::new("status") .config(toml::toml! { [status] + success_symbol = "✔️" disabled = false }) .collect();