use super::{Context, Module, RootModuleConfig};
use crate::configs::character::CharacterConfig;
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
enum ShellEditMode {
Normal,
Insert,
};
const ASSUMED_MODE: ShellEditMode = ShellEditMode::Insert;
let mut module = context.new_module("character");
let config: CharacterConfig = CharacterConfig::try_load(module.config);
module.get_prefix().set_value("");
let props = &context.properties;
let exit_code_default = std::string::String::from("0");
let exit_code = props.get("status_code").unwrap_or(&exit_code_default);
let shell = std::env::var("STARSHIP_SHELL").unwrap_or_default();
let keymap_default = std::string::String::from("viins");
let keymap = props.get("keymap").unwrap_or(&keymap_default);
let exit_success = exit_code == "0";
let mode = match (shell.as_str(), keymap.as_str()) {
("fish", "default") | ("zsh", "vicmd") => ShellEditMode::Normal,
_ => ASSUMED_MODE,
};
if exit_success {
module.set_style(config.style_success);
} else {
module.set_style(config.style_failure);
};
if config.use_symbol_for_status && !exit_success {
module.create_segment("error_symbol", &config.error_symbol)
} else {
match mode {
ShellEditMode::Normal => module.create_segment("vicmd_symbol", &config.vicmd_symbol),
ShellEditMode::Insert => module.create_segment("symbol", &config.symbol),
}
};
Some(module)
}