diff --git a/proto/src/reader/backend.rs b/proto/src/reader/backend.rs new file mode 100644 index 0000000..33db099 --- /dev/null +++ b/proto/src/reader/backend.rs @@ -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 {} + +#[async_trait] +impl BackendProtoReader for R where R: OneWayProtoReader {} + +#[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()); + } +} diff --git a/proto/src/reader/mod.rs b/proto/src/reader/mod.rs index 53bf75c..3c85a0f 100644 --- a/proto/src/reader/mod.rs +++ b/proto/src/reader/mod.rs @@ -1,3 +1,4 @@ +pub mod backend; pub mod frontend; pub mod oneway; pub mod protoreader;