use bytes::BytesMut;
use crate::error::{Error, Result};
use crate::protocol::backend::BackendMessage;
const HEADER_LEN: usize = 5;
pub fn decode_message(buf: &mut BytesMut) -> Result<Option<BackendMessage>> {
if buf.len() < HEADER_LEN {
return Ok(None);
}
let msg_type = buf[0];
let body_len = i32::from_be_bytes([buf[1], buf[2], buf[3], buf[4]]);
if body_len < 4 {
return Err(Error::protocol(format!(
"invalid message length: {body_len}"
)));
}
let total_len = 1 + body_len as usize;
if buf.len() < total_len {
buf.reserve(total_len - buf.len());
return Ok(None);
}
let frame = buf.split_to(total_len).freeze();
let body = frame.slice(HEADER_LEN..);
super::backend::decode(msg_type, body).map(Some)
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SslResponse {
Accepted,
Rejected,
}
pub fn decode_ssl_response(buf: &mut BytesMut) -> Option<SslResponse> {
if buf.is_empty() {
return None;
}
let byte = buf.split_to(1)[0];
match byte {
b'S' => Some(SslResponse::Accepted),
b'N' => Some(SslResponse::Rejected),
_ => None,
}
}