postro 0.1.1

Asynchronous Postgres Driver and Utility
Documentation
use bytes::{Buf, Bytes};

const INLINE_LEN: usize = 15;

pub(crate) enum ValueRef<'a> {
    Slice(&'a [u8]),
    Inline {
        offset: usize,
        value: [u8;INLINE_LEN],
    },
    Bytes(Bytes)
}

impl ValueRef<'_> {
    pub fn inline(slice: &[u8]) -> ValueRef<'static> {
        let len = slice.len();
        assert!(len < INLINE_LEN, "inline slice is too large");
        let mut value = [0u8;INLINE_LEN];
        value[INLINE_LEN - len..].copy_from_slice(slice);
        ValueRef::Inline { offset: INLINE_LEN - len, value }
    }

    pub fn len(&self) -> usize {
        match self {
            ValueRef::Slice(items) => items.len(),
            ValueRef::Inline { offset, .. } => INLINE_LEN - offset,
            ValueRef::Bytes(bytes) => bytes.len(),
        }
    }
}

impl Buf for ValueRef<'_> {
    fn remaining(&self) -> usize {
        match self {
            ValueRef::Slice(items) => Buf::remaining(items),
            ValueRef::Inline { offset, .. } => INLINE_LEN - offset,
            ValueRef::Bytes(bytes) => Buf::remaining(bytes),
        }
    }

    fn chunk(&self) -> &[u8] {
        match self {
            ValueRef::Slice(items) => Buf::chunk(items),
            ValueRef::Inline { offset, value } => &value[*offset..],
            ValueRef::Bytes(bytes) => Buf::chunk(bytes),
        }
    }

    fn advance(&mut self, cnt: usize) {
        match self {
            ValueRef::Slice(items) => Buf::advance(items, cnt),
            ValueRef::Inline { offset, .. } => *offset += cnt,
            ValueRef::Bytes(bytes) => Buf::advance(bytes, cnt),
        }
    }
}

impl std::fmt::Debug for ValueRef<'_> {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        use crate::ext::FmtExt;
        self.chunk().lossy().fmt(f)
    }
}