1use regex::Regex;
2
3pub fn dollar_curly(src: &str) -> String {
4 let mut result = src.to_string();
5 let regex = Regex::new(r"\$\{(.*?)\}").unwrap();
6
7 for token in regex.find_iter(src) {
8 let key = token.as_str().to_string();
9 let env_key = key.replace(['$', '{', '}'], "");
10 if let Ok(env_value) = std::env::var(env_key) {
11 result = result.replace(&key, &env_value);
12 }
13 }
14 result
15}
16
17#[cfg(test)]
18mod test {
19 use super::*;
20
21 #[test]
22 fn dollar_curly_string_test() {
23 let src = "**${CARGO_PKG_NAME}**";
24 assert_eq!(dollar_curly(src), "**anor-utils**");
25 }
26
27 #[test]
28 fn dollar_curly_path_test() {
29 let src = "${CARGO_MANIFEST_DIR}/1/2/3";
30 let expected = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR"))
31 .join("1")
32 .join("2")
33 .join("3");
34
35 assert_eq!(dollar_curly(src), expected.to_string_lossy());
36 }
37}