use byteorder::{BigEndian, WriteBytesExt};
pub struct Writer {
data: Vec<u8>,
}
impl Writer {
pub fn new() -> Writer {
Writer { data: vec![] }
}
pub fn into_vec(self) -> Vec<u8> {
self.data
}
pub fn write_int(&mut self, val: u32) {
if self.data.write_u32::<BigEndian>(val).is_err() {
unreachable!()
};
}
pub fn write_bytes(&mut self, mut buf: Vec<u8>) {
if buf.is_empty() {
return;
}
self.write_int(buf.len() as u32);
self.data.append(&mut buf);
}
pub fn write_mpint(&mut self, mut num: Vec<u8>) {
if num.first().unwrap_or(&0) & 0x80 != 0 {
num.insert(0, 0);
}
self.write_bytes(num)
}
pub fn write_string(&mut self, val: &str) {
self.write_bytes(val.as_bytes().to_vec())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn writer_empty() {
let w = Writer::new();
assert_eq!(w.into_vec().len(), 0);
let mut w = Writer::new();
w.write_bytes(vec![]);
assert_eq!(w.into_vec().len(), 0);
let mut w = Writer::new();
w.write_mpint(vec![]);
assert_eq!(w.into_vec().len(), 0);
}
}