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() {
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!");
}

View File

@ -8,14 +8,16 @@ pub struct Decoder<R: Read, W: Write> {
reader: R,
writer: W,
alphabet: B64Alphabet,
ignore_whitespace: bool,
}
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 {
reader,
writer,
alphabet: alphabet.unwrap_or_default(),
ignore_whitespace,
}
}
@ -43,7 +45,9 @@ impl<R: Read, W: Write> Decoder<R, W> {
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);
}
}