summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bindings.rs15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/bindings.rs b/src/bindings.rs
index d7246c6..cfce627 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,7 +497,7 @@ mod test_bindings {
}
}
-fn regex_from_simple_pattern(pattern: &str) -> Result<String> {
+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;
@@ -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)
}