postgres_types/
private.rs

1use crate::{FromSql, Type};
2pub use bytes::BytesMut;
3use std::error::Error;
4
5pub fn read_be_i32(buf: &mut &[u8]) -> Result<i32, Box<dyn Error + Sync + Send>> {
6    let val = buf
7        .get(..4)
8        .ok_or("invalid buffer size")?
9        .try_into()
10        .unwrap();
11    *buf = &buf[4..];
12    Ok(i32::from_be_bytes(val))
13}
14
15pub fn read_value<'a, T>(
16    type_: &Type,
17    buf: &mut &'a [u8],
18) -> Result<T, Box<dyn Error + Sync + Send>>
19where
20    T: FromSql<'a>,
21{
22    let len = read_be_i32(buf)?;
23    let value = if len < 0 {
24        None
25    } else {
26        let (head, tail) = buf
27            .split_at_checked(len as usize)
28            .ok_or("invalid buffer size")?;
29        *buf = tail;
30        Some(head)
31    };
32    T::from_sql_nullable(type_, value)
33}