use byteorder::{BigEndian, ReadBytesExt};
use tracing::error;
use crate::{PgToPlError, utils::error::PgToPlResult};
pub fn parse_text_array(mut bytes: &[u8]) -> PgToPlResult<Vec<Option<String>>> {
let ndim = bytes.read_i32::<BigEndian>()?;
if ndim == 0 {
return Ok(Vec::new()); } else if ndim != 1 {
error!("ndim {}", ndim);
return Err(PgToPlError::OnlyOneDimensionArraySupported);
}
let _has_null = bytes.read_i32::<BigEndian>()?;
let _element_oid = bytes.read_i32::<BigEndian>()?;
let dim_len = bytes.read_i32::<BigEndian>()? as usize;
let _lower_bound = bytes.read_i32::<BigEndian>()?;
let mut values = Vec::with_capacity(dim_len);
for _ in 0..dim_len {
let item_len = bytes.read_i32::<BigEndian>()?;
if item_len == -1 {
values.push(None);
} else {
let item_len = item_len as usize;
if bytes.len() < item_len {
return Err(PgToPlError::NotEnoughBytes);
}
let (str_bytes, rest) = bytes.split_at(item_len);
bytes = rest;
let s = String::from_utf8_lossy(str_bytes).to_string();
values.push(Some(s));
}
}
Ok(values)
}