use regex::Regex;
use std::collections::HashMap;
pub fn template(txt: &str, values: &HashMap<&str, &str>) -> String {
let mut parsed_txt = String::from(txt);
for (key, value) in values.iter() {
let pattern = format!("\\{{{key}\\}}");
let re = Regex::new(&pattern).unwrap();
parsed_txt = re
.replace_all(&parsed_txt, |_captures: ®ex::Captures<'_>| {
value.to_string()
})
.to_string();
}
parsed_txt
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_correct_output() {
let txt = "Thank you for being with {name}.";
let mut values = HashMap::new();
values.insert("name", "lo_");
assert_eq!(template(txt, &values), "Thank you for being with lo_.");
}
#[test]
fn test_correct_output_for_multiple_values() {
let txt = "Your bill {amount}TK is due in {days} days. Tap to pay early";
let mut values = HashMap::new();
values.insert("amount", "100");
values.insert("days", "5");
assert_eq!(
template(txt, &values),
"Your bill 100TK is due in 5 days. Tap to pay early"
);
}
#[test]
fn test_missing_value() {
let txt = "Thank you for being with {name}.";
let values = HashMap::new();
assert_eq!(template(txt, &values), "Thank you for being with {name}.");
}
#[test]
fn test_no_pattern_found() {
let txt = "Thank you for being with us.";
let values = HashMap::new();
assert_eq!(template(txt, &values), "Thank you for being with us.");
}
}