Skip to content

Commit

Permalink
fix(remap): unescape forward slash in regex (vectordotdev#4864)
Browse files Browse the repository at this point in the history
  • Loading branch information
JeanMertz authored Nov 4, 2020
1 parent f6b443b commit e3327f4
Showing 2 changed files with 40 additions and 3 deletions.
34 changes: 33 additions & 1 deletion lib/remap-lang/src/lib.rs
Original file line number Diff line number Diff line change
@@ -131,6 +131,34 @@ mod tests {
use super::*;
use std::collections::HashMap;

#[derive(Debug, Clone)]
struct RegexPrinter;
impl Function for RegexPrinter {
fn identifier(&self) -> &'static str {
"regex_printer"
}

fn compile(&self, mut arguments: ArgumentList) -> Result<Box<dyn Expression>> {
Ok(Box::new(RegexPrinterFn(arguments.required_regex("value")?)))
}

fn parameters(&self) -> &'static [Parameter] {
&[Parameter {
keyword: "value",
accepts: |_| true,
required: true,
}]
}
}

#[derive(Debug, Clone)]
struct RegexPrinterFn(regex::Regex);
impl Expression for RegexPrinterFn {
fn execute(&self, _: &mut State, _: &mut dyn Object) -> Result<Option<Value>> {
Ok(Some(format!("regex: {:?}", self.0).into()))
}
}

#[test]
fn it_works() {
let cases: Vec<(&str, Result<Option<Value>>)> = vec![
@@ -199,10 +227,14 @@ mod tests {
r#"if false { 1 } else if false { 2 } else if false { 3 } else { 4 }"#,
Ok(Some(4.into())),
),
(
r#"regex_printer(/escaped\/forward slash/)"#,
Ok(Some("regex: escaped/forward slash".into())),
),
];

for (script, result) in cases {
let program = Program::new(script, &[])
let program = Program::new(script, &[Box::new(RegexPrinter)])
.map_err(|e| {
println!("{}", &e);
e
9 changes: 7 additions & 2 deletions lib/remap-lang/src/parser.rs
Original file line number Diff line number Diff line change
@@ -267,7 +267,12 @@ impl Parser<'_> {
fn regex_from_pair(&self, pair: Pair<R>) -> Result<Regex> {
let mut inner = pair.into_inner();

let pattern = inner.next().ok_or(e(R::regex_inner))?.as_str();
let pattern = inner
.next()
.ok_or(e(R::regex_inner))?
.as_str()
.replace("\\/", "/");

let (x, i, m) = inner
.next()
.map(|flags| {
@@ -283,7 +288,7 @@ impl Parser<'_> {
})
.unwrap_or_default();

RegexBuilder::new(pattern)
RegexBuilder::new(&pattern)
.case_insensitive(i)
.multi_line(m)
.ignore_whitespace(x)

0 comments on commit e3327f4

Please sign in to comment.