Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(status): Make status module work even when the status is 0 #3750

Merged
merged 8 commits into from
Mar 16, 2022
9 changes: 5 additions & 4 deletions docs/config/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) |
Expand Down Expand Up @@ -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
```
Expand Down
2 changes: 1 addition & 1 deletion src/configs/status.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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: "🧱",
Expand Down
56 changes: 52 additions & 4 deletions src/modules/status.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<Module<'a>> {
let mut module = context.new_module("status");
let config = StatusConfig::try_load(module.config);
Expand All @@ -43,8 +43,9 @@ pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
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,
Expand Down Expand Up @@ -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"),
Expand Down Expand Up @@ -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)
Expand All @@ -245,6 +292,7 @@ mod tests {
let actual = ModuleRenderer::new("status")
.config(toml::toml! {
[status]
success_symbol = "✔️"
disabled = false
})
.collect();
Expand Down