rs_pgcopy2cbor/
col.rs

1use std::io;
2use std::io::Read;
3
4use ciborium::Value;
5
6#[derive(Default)]
7pub struct Col {
8    /// The length of the column. -1 means NULL.
9    pub length: i32,
10
11    pub raw: Vec<u8>,
12}
13
14impl Col {
15    pub fn from_rdr<R>(rdr: &mut R) -> Result<Self, io::Error>
16    where
17        R: Read,
18    {
19        let mut buf: [u8; 4] = [0; 4];
20        rdr.read_exact(&mut buf)?;
21        let length: i32 = i32::from_be_bytes(buf);
22        match length {
23            -1 => Ok(Self {
24                length,
25                raw: vec![],
26            }),
27            _ => {
28                let mut raw: Vec<u8> = vec![0; length as usize];
29                let buf: &mut [u8] = &mut raw;
30                rdr.read_exact(buf)?;
31                Ok(Self { length, raw })
32            }
33        }
34    }
35}
36
37impl Col {
38    pub fn into_cbor_value(self) -> Value {
39        match self.length {
40            -1 => Value::Null,
41            _ => Value::Bytes(self.raw),
42        }
43    }
44}