diff options
Diffstat (limited to 'src/encoded_string.rs')
-rw-r--r-- | src/encoded_string.rs | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/src/encoded_string.rs b/src/encoded_string.rs new file mode 100644 index 0000000..55090a9 --- /dev/null +++ b/src/encoded_string.rs @@ -0,0 +1,26 @@ +use std::str; + +pub struct EncodedString<'a> { + pub s: str::Bytes<'a>, +} + +impl<'a> Iterator for EncodedString<'a> { + type Item = u8; + + fn next(&mut self) -> Option<Self::Item> { + self.s.next().map(|c| match c { + b'\\' => match self.s.next() { + Some(b'n') => b'\n', + Some(b'\\') | None => b'\\', + Some(c) => c + }, + c => c + }) + } +} + +impl<'a> EncodedString<'a> { + pub fn decode(self) -> String { + String::from_utf8(self.s.collect()).unwrap() + } +} |