nix_compat/aterm/
escape.rs

1use bstr::ByteSlice;
2
3/// Escapes a byte sequence. Does not add surrounding quotes.
4pub fn escape_bytes<P: AsRef<[u8]>>(s: P) -> Vec<u8> {
5    let mut s: Vec<u8> = s.as_ref().to_vec();
6
7    s = s.replace(b"\\", b"\\\\");
8    s = s.replace(b"\n", b"\\n");
9    s = s.replace(b"\r", b"\\r");
10    s = s.replace(b"\t", b"\\t");
11    s = s.replace(b"\"", b"\\\"");
12
13    s
14}
15
16#[cfg(test)]
17mod tests {
18    use super::escape_bytes;
19    use rstest::rstest;
20
21    #[rstest]
22    #[case::empty(b"", b"")]
23    #[case::doublequote(b"\"", b"\\\"")]
24    #[case::colon(b":", b":")]
25    fn escape(#[case] input: &[u8], #[case] expected: &[u8]) {
26        assert_eq!(expected, escape_bytes(input))
27    }
28}