Skip to main content

avrow/
util.rs

1use crate::error::AvrowErr;
2use integer_encoding::VarIntReader;
3use integer_encoding::VarIntWriter;
4use std::io::{Error, ErrorKind, Read, Write};
5use std::str;
6
7pub(crate) fn decode_string<R: Read>(reader: &mut R) -> Result<String, AvrowErr> {
8    let buf = decode_bytes(reader)?;
9    let s = str::from_utf8(&buf).map_err(|_e| {
10        let err = Error::new(ErrorKind::InvalidData, "Failed decoding string from bytes");
11        AvrowErr::DecodeFailed(err)
12    })?;
13    Ok(s.to_string())
14}
15
16pub(crate) fn decode_bytes<R: Read>(reader: &mut R) -> Result<Vec<u8>, AvrowErr> {
17    let len: i64 = reader.read_varint().map_err(AvrowErr::DecodeFailed)?;
18    let mut byte_buf = vec![0u8; len as usize];
19    reader
20        .read_exact(&mut byte_buf)
21        .map_err(AvrowErr::DecodeFailed)?;
22    Ok(byte_buf)
23}
24
25pub fn encode_long<W: Write>(value: i64, writer: &mut W) -> Result<usize, AvrowErr> {
26    writer.write_varint(value).map_err(AvrowErr::EncodeFailed)
27}
28
29pub fn encode_raw_bytes<W: Write>(value: &[u8], writer: &mut W) -> Result<(), AvrowErr> {
30    writer
31        .write(value)
32        .map_err(AvrowErr::EncodeFailed)
33        .map(|_| ())
34}