#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct BashModePrompt<'a> {
pub(crate) original: &'a str,
pub(crate) command: &'a str,
}
pub(crate) fn parse_bash_mode_prompt(prompt: &str) -> Option<BashModePrompt<'_>> {
prompt.strip_prefix('!').map(|command| BashModePrompt {
original: prompt,
command,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bash_mode_parse_bang_prefixed_prompt() {
let parsed = parse_bash_mode_prompt("!git status").unwrap();
assert_eq!(parsed.original, "!git status");
assert_eq!(parsed.command, "git status");
}
#[test]
fn bash_mode_parse_bare_bang_as_empty_command() {
let parsed = parse_bash_mode_prompt("!").unwrap();
assert_eq!(parsed.command, "");
}
#[test]
fn bash_mode_parse_only_first_character() {
assert!(parse_bash_mode_prompt("hello !git status").is_none());
assert!(parse_bash_mode_prompt("/help").is_none());
}
#[test]
fn bash_mode_preserves_command_remainder() {
let parsed = parse_bash_mode_prompt("! cat file.md\n").unwrap();
assert_eq!(parsed.command, " cat file.md\n");
}
}