prmt 0.5.0

Ultra-fast, customizable shell prompt generator with zero-copy parsing
Documentation
use crate::error::Result;
use crate::module_trait::{Module, ModuleContext};

pub struct OkModule;

impl Default for OkModule {
    fn default() -> Self {
        Self::new()
    }
}

impl OkModule {
    pub fn new() -> Self {
        Self
    }
}

impl Module for OkModule {
    fn render(&self, format: &str, context: &ModuleContext) -> Result<Option<String>> {
        if context.exit_code != Some(0) {
            return Ok(None);
        }

        let symbol = match format {
            "" => "❯",
            "code" => "0",
            custom => custom,
        };

        Ok(Some(symbol.to_string()))
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_ok_on_zero_exit_code() {
        let module = OkModule::new();
        let context = ModuleContext {
            exit_code: Some(0),
            ..ModuleContext::default()
        };
        let result = module.render("", &context).unwrap();
        assert_eq!(result, Some("❯".to_string()));
    }

    #[test]
    fn test_ok_hidden_on_error() {
        let module = OkModule::new();
        let context = ModuleContext {
            exit_code: Some(1),
            ..ModuleContext::default()
        };
        let result = module.render("", &context).unwrap();
        assert_eq!(result, None);
    }

    #[test]
    fn test_ok_custom_symbol() {
        let module = OkModule::new();
        let context = ModuleContext {
            exit_code: Some(0),
            ..ModuleContext::default()
        };
        let result = module.render("✓", &context).unwrap();
        assert_eq!(result, Some("✓".to_string()));
    }

    #[test]
    fn test_ok_code_format() {
        let module = OkModule::new();
        let context = ModuleContext {
            exit_code: Some(0),
            ..ModuleContext::default()
        };
        let result = module.render("code", &context).unwrap();
        assert_eq!(result, Some("0".to_string()));
    }
}