Skip to main content

ganit_core/eval/functions/text/regexreplace/
mod.rs

1use crate::eval::coercion::to_string_val;
2use crate::eval::functions::check_arity;
3use crate::types::{ErrorKind, Value};
4use regex_lite::Regex;
5
6/// `REGEXREPLACE(text, pattern, replacement)` — replaces ALL non-overlapping matches
7/// of pattern in text with replacement.
8pub fn regexreplace_fn(args: &[Value]) -> Value {
9    if let Some(err) = check_arity(args, 3, 3) {
10        return err;
11    }
12    let text = match to_string_val(args[0].clone()) {
13        Ok(s) => s,
14        Err(e) => return e,
15    };
16    let pattern = match to_string_val(args[1].clone()) {
17        Ok(s) => s,
18        Err(e) => return e,
19    };
20    let replacement = match to_string_val(args[2].clone()) {
21        Ok(s) => s,
22        Err(e) => return e,
23    };
24    let re = match Regex::new(&pattern) {
25        Ok(r) => r,
26        Err(_) => return Value::Error(ErrorKind::Value),
27    };
28    Value::Text(re.replace_all(&text, replacement.as_str()).into_owned())
29}
30
31#[cfg(test)]
32mod tests;