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}