minisql/proto/src/writer/oneway.rs
2024-01-28 21:40:43 +01:00

32 lines
883 B
Rust

use crate::message::proto_message::ProtoMessage;
use crate::writer::errors::ProtoWriteError;
use crate::writer::protowriter::ProtoWriter;
use async_trait::async_trait;
use tokio::io::{AsyncWrite, AsyncWriteExt};
#[async_trait]
pub trait OneWayProtoWriter<T>
where
T: ProtoMessage,
{
async fn write_proto(&mut self, message: T) -> Result<(), ProtoWriteError>;
}
#[async_trait]
impl<W, T> OneWayProtoWriter<T> for ProtoWriter<W>
where
W: AsyncWrite + Unpin + Send,
T: ProtoMessage + Send + 'static,
{
async fn write_proto(&mut self, message: T) -> Result<(), ProtoWriteError> {
let variant = message.variant();
let data = message.serialize()?;
let length = data.len() as i32 + 4;
self.inner.write_u8(variant).await?;
self.inner.write_i32(length).await?;
self.inner.write_all(&data).await?;
Ok(())
}
}