Skip to main content

isoloom_render/
ruby.rs

1//! Ruby, as a Vagrantfile is written: string literals that hold any text.
2
3/// A Ruby double-quoted string literal reading as `s`: backslashes and quotes escaped, and every
4/// `#` that could start an interpolation (`#{...}`, `#$global`, `#@ivar`) made literal.
5#[must_use]
6pub fn quote(s: &str) -> String {
7    let escaped = s
8        .replace('\\', "\\\\")
9        .replace('"', "\\\"")
10        .replace("#{", "\\#{")
11        .replace("#$", "\\#$")
12        .replace("#@", "\\#@");
13    format!("\"{escaped}\"")
14}
15
16#[cfg(test)]
17mod tests {
18    use super::quote;
19
20    #[test]
21    fn quotes_backslashes_and_interpolations_are_escaped() {
22        assert_eq!(quote(r#"a"b\c"#), r#""a\"b\\c""#);
23        assert_eq!(quote("#{x} #$y #@z # {"), r#""\#{x} \#$y \#@z # {""#);
24    }
25}