32 lines
883 B
Rust
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(())
|
|
}
|
|
}
|