use regex::{Regex, escape};
use std::fmt::{self, Display, Formatter};
pub trait VariableInterpolation {
fn shell_var_to_capturing_regex(&self) -> Regex;
fn template_to_capturing_regex(&self) -> Regex;
fn regex_to_shell_var(regex: &Regex) -> String;
fn regex_to_template(regex: &Regex) -> String;
}
impl VariableInterpolation for String {
fn shell_var_to_capturing_regex(&self) -> Regex {
let clean_var = self.trim_matches(|c: char| c == '$' || c == '{' || c == '}');
Regex::new(&format!(r"(?P<{}>.*)", escape(clean_var))).unwrap()
}
fn template_to_capturing_regex(&self) -> Regex {
let clean_template = self.trim_matches(|c: char| c == '{' || c == '}');
Regex::new(&format!(r"(?P<{}>.*)", escape(clean_template))).unwrap()
}
fn regex_to_shell_var(regex: &Regex) -> String {
let pattern = regex.as_str();
let var_name = pattern.trim_start_matches(r"(?P<").trim_end_matches(r">.*)");
format!("${{{}}}", var_name)
}
fn regex_to_template(regex: &Regex) -> String {
let pattern = regex.as_str();
let placeholder_name = pattern.trim_start_matches(r"(?P<").trim_end_matches(r">.*)");
format!("{{{{{}}}}}", placeholder_name)
}
}