anor_utils/
envsubst.rs

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}