diff options
Diffstat (limited to 'src/bindings.rs')
-rw-r--r-- | src/bindings.rs | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/src/bindings.rs b/src/bindings.rs index 67c45d6..9c0df9e 100644 --- a/src/bindings.rs +++ b/src/bindings.rs @@ -362,7 +362,8 @@ fn from_hashmap(parsed: &ParsedBinding) -> Result<Binding> { let pattern = if parsed.regex.unwrap_or(false) { pattern.to_string() } else { - regex_from_simple_pattern(pattern)? + // if we get here parsed.regex is either None or Some(false) + regex_from_simple_pattern(pattern, parsed.regex.is_some())? }; Ok(Binding::new( @@ -496,8 +497,8 @@ mod test_bindings { } } -fn regex_from_simple_pattern(pattern: &str) -> Result<String> { - let pat = Regex::new(r"\{\S+\}").unwrap(); +fn regex_from_simple_pattern(pattern: &str, explicit_plain: bool) -> Result<String> { + let pat = Regex::new(r"\{[^\s\{\}]+\}").unwrap(); let mut r = String::new(); let mut end = 0; for m in pat.find_iter(pattern) { @@ -505,6 +506,11 @@ fn regex_from_simple_pattern(pattern: &str) -> Result<String> { if before.find('{').is_some() || before.find('}').is_some() { return Err(SubplotError::StrayBraceInSimplePattern(pattern.to_string())); } + if !explicit_plain && before.chars().any(|c| r"$^*.()+\?|[]".contains(c)) { + return Err(SubplotError::SimplePatternHasMetaCharacters( + pattern.to_owned(), + )); + } r.push_str(&escape(before)); let name = &pattern[m.start() + 1..m.end() - 1]; r.push_str(&format!(r"(?P<{}>\S+)", name)); @@ -514,6 +520,11 @@ fn regex_from_simple_pattern(pattern: &str) -> Result<String> { if after.find('{').is_some() || after.find('}').is_some() { return Err(SubplotError::StrayBraceInSimplePattern(pattern.to_string())); } + if !explicit_plain && after.chars().any(|c| r"$^*.()+\?|[]".contains(c)) { + return Err(SubplotError::SimplePatternHasMetaCharacters( + pattern.to_owned(), + )); + } r.push_str(&escape(after)); Ok(r) } @@ -525,31 +536,31 @@ mod test_regex_from_simple_pattern { #[test] fn returns_empty_string_as_is() { - let ret = regex_from_simple_pattern("").unwrap(); + let ret = regex_from_simple_pattern("", false).unwrap(); assert_eq!(ret, ""); } #[test] fn returns_boring_pattern_as_is() { - let ret = regex_from_simple_pattern("boring").unwrap(); + let ret = regex_from_simple_pattern("boring", false).unwrap(); assert_eq!(ret, "boring"); } #[test] fn returns_pattern_with_regexp_chars_escaped() { - let ret = regex_from_simple_pattern(r".[]*\\").unwrap(); + let ret = regex_from_simple_pattern(r".[]*\\", true).unwrap(); assert_eq!(ret, r"\.\[\]\*\\\\"); } #[test] fn returns_simple_pattern_expressed_as_regexp() { - let ret = regex_from_simple_pattern("I am {name}").unwrap(); + let ret = regex_from_simple_pattern("I am {name}", false).unwrap(); assert_eq!(ret, r"I am (?P<name>\S+)"); } #[test] fn returns_error_for_stray_opening_brace() { - match regex_from_simple_pattern("{") { + match regex_from_simple_pattern("{", false) { Err(SubplotError::StrayBraceInSimplePattern(_)) => (), Err(e) => panic!("unexpected error: {}", e), _ => unreachable!(), @@ -558,7 +569,7 @@ mod test_regex_from_simple_pattern { #[test] fn returns_error_for_stray_closing_brace() { - match regex_from_simple_pattern("}") { + match regex_from_simple_pattern("}", false) { Err(SubplotError::StrayBraceInSimplePattern(_)) => (), Err(e) => panic!("unexpected error: {}", e), _ => unreachable!(), @@ -567,7 +578,7 @@ mod test_regex_from_simple_pattern { #[test] fn returns_error_for_stray_opening_brace_before_capture() { - match regex_from_simple_pattern("{") { + match regex_from_simple_pattern("{{foo}", false) { Err(SubplotError::StrayBraceInSimplePattern(_)) => (), Err(e) => panic!("unexpected error: {}", e), _ => unreachable!(), @@ -576,7 +587,7 @@ mod test_regex_from_simple_pattern { #[test] fn returns_error_for_stray_closing_brace_before_capture() { - match regex_from_simple_pattern("}") { + match regex_from_simple_pattern("}{foo}", false) { Err(SubplotError::StrayBraceInSimplePattern(_)) => (), Err(e) => panic!("unexpected error: {}", e), _ => unreachable!(), |