From d044800b1f2de21f1c4452f22f23c3fd620fc08b Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Wed, 8 Jan 2025 15:10:39 -0500 Subject: [PATCH] Add ability to ignore whitespace characters during decoding --- README.md | 2 +- src/decode.rs | 23 +++++++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e2f93c2..e0ccfbe 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ use { }; fn main() { - let mut decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), vec![], None); + let mut decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), vec![], None, false); let output = decoder.decode().unwrap(); assert_eq!(&output, b"Hello, World!"); } diff --git a/src/decode.rs b/src/decode.rs index 4a5683a..4274b29 100644 --- a/src/decode.rs +++ b/src/decode.rs @@ -8,14 +8,16 @@ pub struct Decoder { reader: R, writer: W, alphabet: B64Alphabet, + ignore_whitespace: bool, } impl Decoder { - pub fn new(reader: R, writer: W, alphabet: Option) -> Self { + pub fn new(reader: R, writer: W, alphabet: Option, ignore_whitespace: bool) -> Self { Self { reader, writer, alphabet: alphabet.unwrap_or_default(), + ignore_whitespace, } } @@ -43,7 +45,9 @@ impl Decoder { while n_bytes < 4 { match byte_reader.next() { Some(Ok(b)) => { - if b == b'\n' || b == b'\r' { + if self.ignore_whitespace && b.is_ascii_whitespace() { + continue; + } else if b == b'\n' || b == b'\r' { continue; } else { in_buf[n_bytes] = b; @@ -98,19 +102,26 @@ mod tests { #[test] fn decode() { - let mut decoder = Decoder::new("SGVsbG8sIFdvcmxk".as_bytes(), vec![], None); + let mut decoder = Decoder::new("SGVsbG8sIFdvcmxk".as_bytes(), vec![], None, false); let mut output = decoder.decode().unwrap(); assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World"); output.clear(); - decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), output, None); + decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), output, None, false); output = decoder.decode().unwrap(); assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World!"); output.clear(); - decoder = Decoder::new("SGVsbG8sIFdvcmxkIQo=".as_bytes(), output, None); + decoder = Decoder::new("SGVsbG8sIFdvcmxkIQo=".as_bytes(), output, None, false); output = decoder.decode().unwrap(); assert_eq!(String::from_utf8(output).unwrap(), "Hello, World!\n"); } + #[test] + fn ignore_whitespace() { + let decoder = Decoder::new(" SG\tVsbG8sIFdvcmxkIQ==".as_bytes(), vec![], None, true); + let output = decoder.decode().unwrap(); + assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World!"); + } + #[test] fn decode_wrapped() { let infile = File::open("src/testdata/lorem_b64.txt").unwrap(); @@ -120,7 +131,7 @@ mod tests { .unwrap() .read_to_end(&mut outfile) .unwrap(); - let decoder = Decoder::new(reader, vec![], None); + let decoder = Decoder::new(reader, vec![], None, false); assert_eq!(decoder.decode().unwrap(), outfile); } }