feat(proto): add special messages

This commit is contained in:
Jindřich Moravec 2023-12-11 16:44:35 +01:00
parent ee2742ea03
commit 65f90ba600
2 changed files with 61 additions and 0 deletions

View file

@ -2,3 +2,4 @@ pub mod backend;
pub mod frontend;
pub mod primitive;
pub mod proto_message;
pub mod special;

View file

@ -0,0 +1,60 @@
use crate::message::primitive::pgstring::PgString;
use bincode::de::Decoder;
use bincode::enc::Encoder;
use bincode::error::{DecodeError, EncodeError};
use bincode::{Decode, Encode};
#[derive(Debug)]
pub enum SpecialMessage {
CancelRequest(CancelRequestData),
SSLRequest,
StartupMessage(StartupMessageData),
}
#[derive(Debug, Clone, Encode, Decode)]
pub struct CancelRequestData {
pub pid: i32,
pub secret: i32,
}
#[derive(Debug, Clone)]
pub struct StartupMessageData {
pub version: i32,
pub params: Vec<(PgString, PgString)>,
}
impl Encode for StartupMessageData {
fn encode<E: Encoder>(&self, encoder: &mut E) -> Result<(), EncodeError> {
self.version.encode(encoder)?;
for (key, value) in &self.params {
key.encode(encoder)?;
value.encode(encoder)?;
}
Ok(())
}
}
impl Decode for StartupMessageData {
fn decode<D: Decoder>(decoder: &mut D) -> Result<Self, DecodeError> {
let version = i32::decode(decoder)?;
let mut params = Vec::new();
loop {
let maybe_key = PgString::decode(decoder);
match maybe_key {
Ok(_) => {}
Err(DecodeError::UnexpectedEnd { .. }) => break,
Err(e) => return Err(e),
}
let maybe_value = PgString::decode(decoder);
match maybe_value {
Ok(_) => {}
Err(DecodeError::UnexpectedEnd { .. }) => break,
Err(e) => return Err(e),
}
params.push((maybe_key.unwrap(), maybe_value.unwrap()));
}
Ok(StartupMessageData { version, params })
}
}