Add ability to ignore whitespace characters during decoding

This commit is contained in:
Nathan Fisher 2025-01-08 15:10:39 -05:00
parent 313b877553
commit d044800b1f
2 changed files with 18 additions and 7 deletions

View File

@ -42,7 +42,7 @@ use {
}; };
fn main() { 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(); let output = decoder.decode().unwrap();
assert_eq!(&output, b"Hello, World!"); assert_eq!(&output, b"Hello, World!");
} }

View File

@ -8,14 +8,16 @@ pub struct Decoder<R: Read, W: Write> {
reader: R, reader: R,
writer: W, writer: W,
alphabet: B64Alphabet, alphabet: B64Alphabet,
ignore_whitespace: bool,
} }
impl<R: Read, W: Write> Decoder<R, W> { impl<R: Read, W: Write> Decoder<R, W> {
pub fn new(reader: R, writer: W, alphabet: Option<B64Alphabet>) -> Self { pub fn new(reader: R, writer: W, alphabet: Option<B64Alphabet>, ignore_whitespace: bool) -> Self {
Self { Self {
reader, reader,
writer, writer,
alphabet: alphabet.unwrap_or_default(), alphabet: alphabet.unwrap_or_default(),
ignore_whitespace,
} }
} }
@ -43,7 +45,9 @@ impl<R: Read, W: Write> Decoder<R, W> {
while n_bytes < 4 { while n_bytes < 4 {
match byte_reader.next() { match byte_reader.next() {
Some(Ok(b)) => { 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; continue;
} else { } else {
in_buf[n_bytes] = b; in_buf[n_bytes] = b;
@ -98,19 +102,26 @@ mod tests {
#[test] #[test]
fn decode() { 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(); let mut output = decoder.decode().unwrap();
assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World"); assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World");
output.clear(); output.clear();
decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), output, None); decoder = Decoder::new("SGVsbG8sIFdvcmxkIQ==".as_bytes(), output, None, false);
output = decoder.decode().unwrap(); output = decoder.decode().unwrap();
assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World!"); assert_eq!(String::from_utf8(output.clone()).unwrap(), "Hello, World!");
output.clear(); output.clear();
decoder = Decoder::new("SGVsbG8sIFdvcmxkIQo=".as_bytes(), output, None); decoder = Decoder::new("SGVsbG8sIFdvcmxkIQo=".as_bytes(), output, None, false);
output = decoder.decode().unwrap(); output = decoder.decode().unwrap();
assert_eq!(String::from_utf8(output).unwrap(), "Hello, World!\n"); 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] #[test]
fn decode_wrapped() { fn decode_wrapped() {
let infile = File::open("src/testdata/lorem_b64.txt").unwrap(); let infile = File::open("src/testdata/lorem_b64.txt").unwrap();
@ -120,7 +131,7 @@ mod tests {
.unwrap() .unwrap()
.read_to_end(&mut outfile) .read_to_end(&mut outfile)
.unwrap(); .unwrap();
let decoder = Decoder::new(reader, vec![], None); let decoder = Decoder::new(reader, vec![], None, false);
assert_eq!(decoder.decode().unwrap(), outfile); assert_eq!(decoder.decode().unwrap(), outfile);
} }
} }