use crate::error::Result;
use crate::module_trait::{Module, ModuleContext};
pub struct FailModule;
impl Default for FailModule {
fn default() -> Self {
Self::new()
}
}
impl FailModule {
pub fn new() -> Self {
Self
}
}
impl Module for FailModule {
fn render(&self, format: &str, context: &ModuleContext) -> Result<Option<String>> {
let exit_code = context.exit_code.unwrap_or(0);
if exit_code == 0 {
return Ok(None);
}
let symbol = match format {
"" | "full" => "❯".to_string(),
"code" => exit_code.to_string(),
custom => custom.to_string(),
};
Ok(Some(symbol))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fail_on_non_zero_exit_code() {
let module = FailModule::new();
let context = ModuleContext {
exit_code: Some(127),
..ModuleContext::default()
};
let result = module.render("", &context).unwrap();
assert_eq!(result, Some("❯".to_string()));
}
#[test]
fn test_fail_hidden_on_success() {
let module = FailModule::new();
let context = ModuleContext {
exit_code: Some(0),
..ModuleContext::default()
};
let result = module.render("", &context).unwrap();
assert_eq!(result, None);
}
#[test]
fn test_fail_shows_exit_code() {
let module = FailModule::new();
let context = ModuleContext {
exit_code: Some(42),
..ModuleContext::default()
};
let result = module.render("code", &context).unwrap();
assert_eq!(result, Some("42".to_string()));
}
#[test]
fn test_fail_custom_symbol() {
let module = FailModule::new();
let context = ModuleContext {
exit_code: Some(1),
..ModuleContext::default()
};
let result = module.render("✗", &context).unwrap();
assert_eq!(result, Some("✗".to_string()));
}
}