sqlx_postgres/io/
buf_mut.rsuse crate::io::{PortalId, StatementId};
pub trait PgBufMutExt {
fn put_length_prefixed<F>(&mut self, f: F) -> Result<(), crate::Error>
where
F: FnOnce(&mut Vec<u8>) -> Result<(), crate::Error>;
fn put_statement_name(&mut self, id: StatementId);
fn put_portal_name(&mut self, id: PortalId);
}
impl PgBufMutExt for Vec<u8> {
fn put_length_prefixed<F>(&mut self, write_contents: F) -> Result<(), crate::Error>
where
F: FnOnce(&mut Vec<u8>) -> Result<(), crate::Error>,
{
let offset = self.len();
self.extend(&[0; 4]);
let write_result = write_contents(self);
let size_result = write_result.and_then(|_| {
let size = self.len() - offset;
i32::try_from(size)
.map_err(|_| err_protocol!("message size out of range for protocol: {size}"))
});
match size_result {
Ok(size) => {
self[offset..(offset + 4)].copy_from_slice(&size.to_be_bytes());
Ok(())
}
Err(e) => {
self.truncate(offset);
Err(e)
}
}
}
#[inline]
fn put_statement_name(&mut self, id: StatementId) {
id.put_name_with_nul(self);
}
#[inline]
fn put_portal_name(&mut self, id: PortalId) {
id.put_name_with_nul(self);
}
}