diff --git a/rule_parser/src/lib.rs b/rule_parser/src/lib.rs index aa0a1d9..a5ce746 100644 --- a/rule_parser/src/lib.rs +++ b/rule_parser/src/lib.rs @@ -193,6 +193,7 @@ fn eval_suggest(suggest: &str) -> TokenStream2 { let mut cmd_list = Vec::new(); replaces::opts(&mut suggest, &mut replace_list, &mut opt_list); + replaces::cmd_reg(&mut suggest, &mut replace_list); replaces::err(&mut suggest, &mut replace_list); replaces::command(&mut suggest, &mut replace_list); replaces::shell(&mut suggest, &mut cmd_list); diff --git a/rule_parser/src/replaces.rs b/rule_parser/src/replaces.rs index 0806255..8280441 100644 --- a/rule_parser/src/replaces.rs +++ b/rule_parser/src/replaces.rs @@ -48,6 +48,41 @@ pub fn opts(suggest: &mut String, replace_list: &mut Vec, opt_list } } +pub fn cmd_reg(suggest: &mut String, replace_list: &mut Vec) { + let mut replace_tag = 0; + let tag_name = "cmd"; + + while suggest.contains("{{cmd::") { + let (placeholder, args) = eval_placeholder(suggest, "{{cmd::", "}}"); + + let regex = suggest[args.to_owned()].trim(); + + let command = format!("cmd_regex(r###\"{}\"###, &last_command)", regex); + + replace_list.push(rtag(tag_name, replace_tag, command)); + suggest.replace_range(placeholder, &tag(tag_name, replace_tag)); + replace_tag += 1; + } +} + +pub fn err(suggest: &mut String, replace_list: &mut Vec) { + let mut replace_tag = 0; + let tag_name = "err"; + + while suggest.contains("{{err::") { + let (placeholder, args) = eval_placeholder(suggest, "{{err::", "}}"); + + let regex = suggest[args.to_owned()].trim(); + + let command = format!("err_regex(r###\"{}\"###, error_msg)", regex); + + replace_list.push(rtag(tag_name, replace_tag, command)); + suggest.replace_range(placeholder, &tag(tag_name, replace_tag)); + replace_tag += 1; + } +} + + pub fn command(suggest: &mut String, replace_list: &mut Vec) { let mut replace_tag = 0; let tag_name = "command"; @@ -151,23 +186,6 @@ pub fn typo(suggest: &mut String, replace_list: &mut Vec) { } -pub fn err(suggest: &mut String, replace_list: &mut Vec) { - let mut replace_tag = 0; - let tag_name = "err"; - - while suggest.contains("{{err::") { - let (placeholder, args) = eval_placeholder(suggest, "{{err::", "}}"); - - let regex = suggest[args.to_owned()].trim(); - - let command = format!("err_regex(r###\"{}\"###, error_msg)", regex); - - replace_list.push(rtag(tag_name, replace_tag, command)); - suggest.replace_range(placeholder, &tag(tag_name, replace_tag)); - replace_tag += 1; - } -} - pub fn shell(suggest: &mut String, cmd_list: &mut Vec) { while suggest.contains("{{shell") { let (placeholder, args) = eval_placeholder(suggest, "{{shell", "}}"); diff --git a/src/suggestions.rs b/src/suggestions.rs index 7d0a959..4e9fd4b 100644 --- a/src/suggestions.rs +++ b/src/suggestions.rs @@ -67,6 +67,16 @@ fn err_regex(regex: &str, error_msg: &str) -> String { err.join(" ") } +fn cmd_regex(regex: &str, command: &str) -> String { + let regex = Regex::new(regex).unwrap(); + let err = regex + .find_iter(command) + .map(|cap| cap.as_str().to_owned()) + .collect::>(); + + err.join(" ") +} + fn eval_shell_command(shell: &str, command: &str) -> Vec { let output = std::process::Command::new(shell) .arg("-c")