feat(proto): add backend message reader

This commit is contained in:
Jindřich Moravec 2023-12-11 16:54:12 +01:00
parent 0a6e486005
commit 393bc0a751
2 changed files with 59 additions and 0 deletions

View file

@ -0,0 +1,58 @@
use crate::message::backend::BackendMessage;
use crate::reader::oneway::OneWayProtoReader;
use async_trait::async_trait;
#[async_trait]
pub trait BackendProtoReader: OneWayProtoReader<BackendMessage> {}
#[async_trait]
impl<R> BackendProtoReader for R where R: OneWayProtoReader<BackendMessage> {}
#[cfg(test)]
mod tests {
use crate::message::backend::{
AuthenticationOkData, BackendKeyDataData, BackendMessage, CommandCompleteData,
};
use crate::reader::oneway::OneWayProtoReader;
use crate::reader::protoreader::ProtoReader;
use std::io::Cursor;
use tokio::io::{AsyncBufReadExt, BufReader};
#[tokio::test]
async fn test_message_sequence() {
let data = [
b'R', 0, 0, 0, 8, 0, 0, 0, 123, b'K', 0, 0, 0, 12, 0, 0, 0, 111, 0, 0, 0, 222, b'C', 0,
0, 0, 8, b'A', b'B', b'C', 0,
];
let reader = BufReader::new(Cursor::new(&data));
let mut reader = ProtoReader::new(reader, 1024);
let msg = reader.read_proto().await;
assert!(matches!(
msg,
Ok(BackendMessage::AuthenticationOk(AuthenticationOkData {
status: 123
}))
));
let msg = reader.read_proto().await;
assert!(matches!(
msg,
Ok(BackendMessage::BackendKeyData(BackendKeyDataData {
process: 111,
secret: 222
}))
));
let msg = reader.read_proto().await;
assert!(match msg {
Ok(BackendMessage::CommandComplete(CommandCompleteData { tag })) =>
tag.as_str() == "ABC",
_ => false,
});
let rest = reader.inner.fill_buf().await.unwrap();
assert!(rest.is_empty());
}
}

View file

@ -1,3 +1,4 @@
pub mod backend;
pub mod frontend;
pub mod oneway;
pub mod protoreader;