Add ability to ignore whitespace characters during decoding
This commit is contained in:
parent
313b877553
commit
d044800b1f
@ -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!");
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user