feat(proto): add backend message writer

This commit is contained in:
Jindřich Moravec 2023-12-11 16:50:06 +01:00
parent 0a3683e2fa
commit 225f9e43d3
2 changed files with 60 additions and 0 deletions

View file

@ -0,0 +1,59 @@
use crate::message::backend::BackendMessage;
use crate::writer::oneway::OneWayProtoWriter;
use crate::writer::protowriter::ProtoWriter;
use async_trait::async_trait;
use tokio::io::{AsyncWrite, AsyncWriteExt};
#[async_trait]
pub trait BackendProtoWriter: OneWayProtoWriter<BackendMessage> {
async fn write_ssl_reject(&mut self) -> anyhow::Result<()>;
}
#[async_trait]
impl<W> BackendProtoWriter for ProtoWriter<W>
where
W: AsyncWrite + Unpin + Send,
{
async fn write_ssl_reject(&mut self) -> anyhow::Result<()> {
self.inner.write_u8(b'N').await?;
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::message::backend::AuthenticationOkData;
use crate::writer::protowriter::ProtoWriter;
use tokio::io::BufWriter;
#[tokio::test]
async fn test_message_sequence() {
let writer = BufWriter::new(Vec::new());
let mut writer = ProtoWriter::new(writer);
writer
.write_proto(BackendMessage::AuthenticationOk(AuthenticationOkData {
status: 123,
}))
.await
.unwrap();
writer.write_proto(BackendMessage::NoData).await.unwrap();
assert_eq!(
writer.inner.buffer(),
vec![b'R', 0, 0, 0, 8, 0, 0, 0, 123, b'n', 0, 0, 0, 4]
);
}
#[tokio::test]
async fn test_ssl_reject() {
let writer = BufWriter::new(Vec::new());
let mut writer = ProtoWriter::new(writer);
writer.write_ssl_reject().await.unwrap();
assert_eq!(writer.inner.buffer(), vec![b'N']);
}
}

View file

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