feat(proto): add frontend messages
This commit is contained in:
parent
3512067c4e
commit
ee2742ea03
2 changed files with 69 additions and 0 deletions
68
proto/src/message/frontend.rs
Normal file
68
proto/src/message/frontend.rs
Normal file
|
|
@ -0,0 +1,68 @@
|
||||||
|
use crate::message::primitive::data::MessageData;
|
||||||
|
use crate::message::primitive::pgstring::PgString;
|
||||||
|
use crate::message::proto_message::ProtoMessage;
|
||||||
|
use bincode::{Decode, Encode};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum FrontendMessage {
|
||||||
|
Query(QueryData),
|
||||||
|
Terminate,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ProtoMessage for FrontendMessage {
|
||||||
|
fn variant(&self) -> u8 {
|
||||||
|
match self {
|
||||||
|
FrontendMessage::Query(_) => b'Q',
|
||||||
|
FrontendMessage::Terminate => b'X',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn serialize(&self) -> anyhow::Result<Vec<u8>> {
|
||||||
|
match self {
|
||||||
|
FrontendMessage::Query(data) => data.serialize(),
|
||||||
|
FrontendMessage::Terminate => Ok(Vec::with_capacity(0)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize(variant: u8, data: &[u8]) -> anyhow::Result<Self> {
|
||||||
|
match variant {
|
||||||
|
b'Q' => Ok(FrontendMessage::Query(QueryData::deserialize(data)?)),
|
||||||
|
b'X' => Ok(FrontendMessage::Terminate),
|
||||||
|
v => Err(anyhow::anyhow!("Unknown frontend message variant: {v}")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, Encode, Decode)]
|
||||||
|
pub struct QueryData {
|
||||||
|
pub query: PgString,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_symmetric_query() {
|
||||||
|
let frontend = FrontendMessage::Query(QueryData {
|
||||||
|
query: PgString::from("SELECT * FROM foo WHERE bar = $1"),
|
||||||
|
});
|
||||||
|
let raw = frontend.serialize().unwrap();
|
||||||
|
let variant = frontend.variant();
|
||||||
|
|
||||||
|
let message = FrontendMessage::deserialize(variant, &raw).unwrap();
|
||||||
|
assert!(
|
||||||
|
matches!(message, FrontendMessage::Query(QueryData { query }) if query.as_str() == "SELECT * FROM foo WHERE bar = $1")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_symmetric_terminate() {
|
||||||
|
let frontend = FrontendMessage::Terminate;
|
||||||
|
let raw = frontend.serialize().unwrap();
|
||||||
|
let variant = frontend.variant();
|
||||||
|
|
||||||
|
let message = FrontendMessage::deserialize(variant, &raw).unwrap();
|
||||||
|
assert!(matches!(message, FrontendMessage::Terminate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
pub mod backend;
|
pub mod backend;
|
||||||
|
pub mod frontend;
|
||||||
pub mod primitive;
|
pub mod primitive;
|
||||||
pub mod proto_message;
|
pub mod proto_message;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue