use std::io::{Write};
use std::io::Result as IOResult;
pub trait Padding {
fn max_size(&self) -> usize;
fn pad<W: Write>(&self, last_byte: u8, byte_fill: u8, writer: &mut W) -> IOResult<()>;
fn bits_left(&self, last_bytes: &[u8]) -> IOResult<usize>;
}
#[derive(Default, Debug)]
pub struct NoPadding {}
impl NoPadding {
pub fn new() -> Self {
NoPadding {}
}
}
impl Padding for NoPadding {
fn max_size(&self) -> usize {
0
}
fn pad<W: Write>(&self, last_byte: u8, byte_fill: u8, writer: &mut W) -> IOResult<()> {
if byte_fill > 0 {
writer.write_all(&[last_byte])
} else {
Ok(())
}
}
fn bits_left(&self, _: &[u8]) -> IOResult<usize> {
Ok(0)
}
}
#[derive(Debug, Default)]
pub struct LengthPadding {}
impl LengthPadding {
pub fn new() -> Self {
LengthPadding {}
}
}
impl Padding for LengthPadding {
fn max_size(&self) -> usize {
2
}
fn pad<W: Write>(&self, last_byte: u8, byte_fill: u8, writer: &mut W) -> IOResult<()> {
if byte_fill > 0 {
writer.write_all(&[last_byte, byte_fill])
} else {
writer.write_all(&[8u8])
}
}
fn bits_left(&self, last_bytes: &[u8]) -> IOResult<usize> {
if last_bytes.len() == 2 {
Ok(last_bytes[1] as usize)
} else {
Ok(0)
}
}
}