clickhouse-types 0.1.2

Data types utils to use with Native and RowBinary(WithNamesAndTypes) formats in ClickHouse
Documentation
use crate::error::TypesError;
use crate::leb128::read_leb128;
use bytes::Buf;

#[inline]
pub(crate) fn read_string(mut buffer: impl Buf) -> Result<String, TypesError> {
    let length = read_leb128(&mut buffer)? as usize;
    if length == 0 {
        return Ok("".to_string());
    }
    ensure_size(&mut buffer, length)?;
    let result = String::from_utf8_lossy(&buffer.copy_to_bytes(length)).to_string();
    Ok(result)
}

#[inline]
pub(crate) fn ensure_size(buffer: impl Buf, size: usize) -> Result<(), TypesError> {
    if buffer.remaining() < size {
        Err(TypesError::NotEnoughData(format!(
            "expected at least {} bytes, but only {} bytes remaining",
            size,
            buffer.remaining()
        )))
    } else {
        Ok(())
    }
}