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}