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
use std::io;

use crate::consts::*;
use crate::error::Error;
use crate::io::{Reader, Writer};

impl<R> Reader<R>
where
    R: io::Read,
{
    pub fn recv(&mut self) -> Result<Vec<u8>, Error> {
        let u = self.read_u16()?;

        if self.read_u8()? != ERL_VERSION_MAGIC {
            return Err(invalid_data!("ERL_VERSION_MAGIC"));
        }

        self.read_exact_usize(u as usize - 1)
    }
}

impl<W> Writer<W>
where
    W: io::Write,
{
    pub fn send(&mut self, v: &[u8]) -> Result<(), Error> {
        self.write_u16(v.len() as u16 + 1)?;
        self.write_u8(ERL_VERSION_MAGIC)?;
        self.write_all(v)?;
        self.flush()
    }
}