use zerocopy::{FromBytes, Immutable, KnownLayout};
use crate::error::{Error, Result};
use crate::protocol::codec::read_u32;
use crate::protocol::types::Oid;
use zerocopy::byteorder::big_endian::U16 as U16BE;
#[derive(Debug, Clone, Copy)]
pub struct ParseComplete;
impl ParseComplete {
pub fn parse(_payload: &[u8]) -> Result<Self> {
Ok(Self)
}
}
#[derive(Debug, Clone, Copy)]
pub struct BindComplete;
impl BindComplete {
pub fn parse(_payload: &[u8]) -> Result<Self> {
Ok(Self)
}
}
#[derive(Debug, Clone, Copy)]
pub struct CloseComplete;
impl CloseComplete {
pub fn parse(_payload: &[u8]) -> Result<Self> {
Ok(Self)
}
}
#[derive(Debug, Clone, Copy)]
pub struct NoData;
impl NoData {
pub fn parse(_payload: &[u8]) -> Result<Self> {
Ok(Self)
}
}
#[derive(Debug, Clone, Copy)]
pub struct PortalSuspended;
impl PortalSuspended {
pub fn parse(_payload: &[u8]) -> Result<Self> {
Ok(Self)
}
}
#[derive(Debug, Clone, Copy, FromBytes, KnownLayout, Immutable)]
#[repr(C, packed)]
pub struct ParameterDescriptionHead {
pub num_params: U16BE,
}
#[derive(Debug, Clone)]
pub struct ParameterDescription {
param_oids: Vec<Oid>,
}
impl ParameterDescription {
pub fn parse(payload: &[u8]) -> Result<Self> {
let head = ParameterDescriptionHead::ref_from_bytes(&payload[..2])
.map_err(|e| Error::LibraryBug(format!("ParameterDescription header: {e:?}")))?;
let num_params = head.num_params.get() as usize;
let mut param_oids = Vec::with_capacity(num_params);
let mut data = &payload[2..];
for _ in 0..num_params {
let (oid, rest) = read_u32(data)?;
param_oids.push(oid);
data = rest;
}
Ok(Self { param_oids })
}
pub fn len(&self) -> usize {
self.param_oids.len()
}
pub fn is_empty(&self) -> bool {
self.param_oids.is_empty()
}
pub fn oids(&self) -> &[Oid] {
&self.param_oids
}
pub fn iter(&self) -> impl Iterator<Item = &Oid> {
self.param_oids.iter()
}
}