use crate::error::Result;
use crate::protocol::codec::{read_u8, read_u16};
use crate::protocol::types::FormatCode;
#[derive(Debug, Clone)]
pub struct CopyInResponse {
pub format: FormatCode,
pub column_formats: Vec<FormatCode>,
}
impl CopyInResponse {
pub fn parse(payload: &[u8]) -> Result<Self> {
let (format_byte, rest) = read_u8(payload)?;
let format = FormatCode::from_u16(format_byte as u16);
let (num_columns, mut rest) = read_u16(rest)?;
let mut column_formats = Vec::with_capacity(num_columns as usize);
for _ in 0..num_columns {
let (fmt, remaining) = read_u16(rest)?;
column_formats.push(FormatCode::from_u16(fmt));
rest = remaining;
}
Ok(Self {
format,
column_formats,
})
}
pub fn is_binary(&self) -> bool {
matches!(self.format, FormatCode::Binary)
}
}
#[derive(Debug, Clone)]
pub struct CopyOutResponse {
pub format: FormatCode,
pub column_formats: Vec<FormatCode>,
}
impl CopyOutResponse {
pub fn parse(payload: &[u8]) -> Result<Self> {
let (format_byte, rest) = read_u8(payload)?;
let format = FormatCode::from_u16(format_byte as u16);
let (num_columns, mut rest) = read_u16(rest)?;
let mut column_formats = Vec::with_capacity(num_columns as usize);
for _ in 0..num_columns {
let (fmt, remaining) = read_u16(rest)?;
column_formats.push(FormatCode::from_u16(fmt));
rest = remaining;
}
Ok(Self {
format,
column_formats,
})
}
pub fn is_binary(&self) -> bool {
matches!(self.format, FormatCode::Binary)
}
}
#[derive(Debug, Clone)]
pub struct CopyBothResponse {
pub format: FormatCode,
pub column_formats: Vec<FormatCode>,
}
impl CopyBothResponse {
pub fn parse(payload: &[u8]) -> Result<Self> {
let (format_byte, rest) = read_u8(payload)?;
let format = FormatCode::from_u16(format_byte as u16);
let (num_columns, mut rest) = read_u16(rest)?;
let mut column_formats = Vec::with_capacity(num_columns as usize);
for _ in 0..num_columns {
let (fmt, remaining) = read_u16(rest)?;
column_formats.push(FormatCode::from_u16(fmt));
rest = remaining;
}
Ok(Self {
format,
column_formats,
})
}
}