1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
use byteorder::{BigEndian, ByteOrder, LittleEndian, ReadBytesExt, WriteBytesExt};
use bytes::BytesMut;
use std::io;
use std::io::{Cursor, Write};
pub struct IOWriteError {
    pub value: IOWriteErrorValue,
}

pub enum IOWriteErrorValue {
    NotEnoughBytes,
    IO(io::Error),
}

impl From<IOWriteErrorValue> for IOWriteError {
    fn from(val: IOWriteErrorValue) -> Self {
        IOWriteError { value: val }
    }
}

impl From<io::Error> for IOWriteError {
    fn from(error: io::Error) -> Self {
        IOWriteError {
            value: IOWriteErrorValue::IO(error),
        }
    }
}

pub struct Writer {
    bytes: Cursor<Vec<u8>>,
}

impl Writer {
    pub fn new(input: Cursor<Vec<u8>>) -> Writer {
        Writer { bytes: input }
    }

    pub fn write_u8(&mut self, byte: u8) -> Result<(), IOWriteError> {
        self.bytes.write_u8(byte)?;
        Ok(())
    }

    pub fn write_u16(&mut self, bytes: u16) -> Result<(), IOWriteError> {
        self.bytes.write_u16::<BigEndian>(bytes)?;
        Ok(())
    }

    pub fn write_u24(&mut self, bytes: u32) -> Result<(), IOWriteError> {
        self.bytes.write_u24::<BigEndian>(bytes)?;
        Ok(())
    }

    pub fn write_u32<T: ByteOrder>(&mut self, bytes: u32) -> Result<(), IOWriteError> {
        self.bytes.write_u32::<T>(bytes)?;
        Ok(())
    }

    pub fn write(&mut self, buf: &[u8]) -> Result<(), IOWriteError> {
        self.bytes.write(buf)?;
        Ok(())
    }
}