pub fn substitute(input: &str) -> String {
let mut out = String::new();
let mut escaped = false;
for ch in input.chars() {
if escaped {
match ch {
'\\' => out.push('\\'),
'n' => out.push('\n'),
'r' => out.push('\r'),
't' => out.push('\t'),
c => {
out.push('\\');
out.push(c);
},
}
escaped = false;
}
else if ch == '\\' {
escaped = true;
}
else {
out.push(ch);
}
}
out
}
#[cfg(test)]
mod test {
use super::substitute;
#[test]
fn test_backslash_escape() {
let input = r"\\";
let output = substitute(input);
assert_eq!(r"\", &output);
let input = r"\\n";
let output = substitute(input);
assert_eq!(r"\n", &output);
}
}