diff options
Diffstat (limited to 'tvix/nix-compat/src/aterm/escape.rs')
-rw-r--r-- | tvix/nix-compat/src/aterm/escape.rs | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/tvix/nix-compat/src/aterm/escape.rs b/tvix/nix-compat/src/aterm/escape.rs new file mode 100644 index 0000000000..80a85d2103 --- /dev/null +++ b/tvix/nix-compat/src/aterm/escape.rs @@ -0,0 +1,28 @@ +use bstr::ByteSlice; + +/// Escapes a byte sequence. Does not add surrounding quotes. +pub fn escape_bytes<P: AsRef<[u8]>>(s: P) -> Vec<u8> { + let mut s: Vec<u8> = s.as_ref().to_vec(); + + s = s.replace(b"\\", b"\\\\"); + s = s.replace(b"\n", b"\\n"); + s = s.replace(b"\r", b"\\r"); + s = s.replace(b"\t", b"\\t"); + s = s.replace(b"\"", b"\\\""); + + s +} + +#[cfg(test)] +mod tests { + use super::escape_bytes; + use rstest::rstest; + + #[rstest] + #[case::empty(b"", b"")] + #[case::doublequote(b"\"", b"\\\"")] + #[case::colon(b":", b":")] + fn escape(#[case] input: &[u8], #[case] expected: &[u8]) { + assert_eq!(expected, escape_bytes(input)) + } +} |