cartel-pg 0.29.0

Async PostgreSQL driver for the dope runtime
use crate::protocol::encode::Error;

#[doc(hidden)]
pub struct Formats<'a> {
    values: &'a [u16],
    columns: u16,
    index: u16,
}

impl<'a> Formats<'a> {
    pub(crate) const fn new(values: &'a [u16], columns: u16) -> Self {
        Self {
            values,
            columns,
            index: 0,
        }
    }

    pub(crate) fn finish(self) -> Result<(), Error> {
        if self.index == self.columns {
            Ok(())
        } else {
            Err(Error::ResultValueCount {
                expected: usize::from(self.columns),
                actual: usize::from(self.index),
            })
        }
    }

    pub(super) fn take(&mut self, expected: u16) -> Result<(), Error> {
        let index = usize::from(self.index);
        if self.index >= self.columns {
            return Err(Error::ResultValueCount {
                expected: usize::from(self.columns),
                actual: index + 1,
            });
        }
        let actual = match self.values {
            [] => 0,
            [format] => *format,
            values => values[index],
        };
        if actual != expected {
            return Err(Error::ResultEncoding {
                index,
                expected,
                actual,
            });
        }
        self.index += 1;
        Ok(())
    }
}