use crate::postgres::postgres_types::Int4;
use crate::postgres::protocol::new_reader::NewReader;
#[derive(Default)]
pub struct ParameterDescription {
pub parameters: Box<[Int4]>,
}
impl ParameterDescription {
pub fn decode_internal<Container: super::new_reader::ReaderContext>(
mut reader: NewReader<Container>,
) -> Result<Self, bun_core::Error> {
let mut remaining_bytes = reader.length()?;
remaining_bytes = remaining_bytes.saturating_sub(4);
let _ = remaining_bytes;
let count = reader.short()?;
let n = usize::from(count);
let mut parameters: Box<[Int4]> = vec![Int4::default(); n].into_boxed_slice();
let data = reader.read(n * core::mem::size_of::<Int4>())?;
let input_params = to_int32_slice(data.slice());
debug_assert_eq!(input_params.len(), parameters.len());
for (src, dest) in input_params.iter().zip(parameters.iter_mut()) {
*dest = Int4::from_ne_bytes(*src).swap_bytes();
}
Ok(Self { parameters })
}
pub fn decode<Container: super::new_reader::ReaderContext>(
context: Container,
) -> Result<Self, bun_core::Error> {
Self::decode_internal(NewReader { wrapped: context })
}
}
fn to_int32_slice(slice: &[u8]) -> &[[u8; core::mem::size_of::<Int4>()]] {
let n = core::mem::size_of::<Int4>();
bun_core::cast_slice(&slice[..slice.len() - slice.len() % n])
}