Added blocking and async utilities for sending RaaS messages

This commit is contained in:
joeyahines committed 2024-06-01 12:08:50 -06:00
1 parent fab124d725
commit 3496b9dda1
3 files changed
+181 -1

No files matched your search

+94 -1
View File
@@ -1,4 +1,7 @@
pub mod raas {
#[cfg(feature = "async")]
use tokio::io::{AsyncReadExt, AsyncWriteExt};
pub mod register {
include!(concat!(env!("OUT_DIR"), "/raas.register.rs"));
}
@@ -57,12 +60,70 @@ pub mod raas {
bytes
}
}
#[cfg(not(feature = "async"))]
pub fn recv_raas_msg<T: std::io::Read>(stream: &mut T) -> Result<RaasMessage, std::io::Error> {
let mut message_len_bytes = [0u8; 4];
stream.read_exact(&mut message_len_bytes)?;
let len = u32::from_be_bytes(message_len_bytes);
let mut message = vec![0u8; len as usize];
stream.read_exact(&mut message)?;
Ok(RaasMessage { len, msg: message })
}
#[cfg(not(feature = "async"))]
pub fn send_raas_msg<T: std::io::Write>(
stream: &mut T,
data: Vec<u8>,
) -> Result<(), std::io::Error> {
let msg = RaasMessage::new(data);
stream.write_all(&msg.into_bytes())?;
Ok(())
}
#[cfg(feature = "async")]
pub async fn recv_raas_msg<T: AsyncReadExt + std::marker::Unpin>(
stream: &mut T,
) -> Result<RaasMessage, std::io::Error> {
let mut message_len_bytes = [0u8; 4];
stream.read_exact(&mut message_len_bytes).await?;
let len = u32::from_be_bytes(message_len_bytes);
let mut message = vec![0u8; len as usize];
stream.read_exact(&mut message).await?;
Ok(RaasMessage { len, msg: message })
}
#[cfg(feature = "async")]
pub async fn send_raas_msg<T: AsyncWriteExt + std::marker::Unpin>(
stream: &mut T,
data: Vec<u8>,
) -> Result<(), std::io::Error> {
let msg = RaasMessage::new(data);
stream.write_all(&msg.into_bytes()).await?;
Ok(())
}
}
#[cfg(test)]
mod test {
use crate::raas;
use crate::raas::RaasMessage;
use crate::raas::{recv_raas_msg, send_raas_msg, RaasMessage};
#[cfg(not(feature = "async"))]
use std::io::BufReader;
#[cfg(feature = "async")]
use tokio::io::BufReader;
#[test]
fn create_cmd() {
@@ -111,4 +172,36 @@ mod test {
assert_eq!(decoded_message.len, decoded_message.len);
assert_eq!(decoded_message.msg, original_message.msg);
}
#[cfg(not(feature = "async"))]
#[test]
fn send_recv_test_raas_message() {
let mut msg_buffer = Vec::new();
let message = Vec::from(b"Hello World");
send_raas_msg(&mut msg_buffer, message.clone()).unwrap();
let mut reader = BufReader::new(msg_buffer.as_slice());
let out_msg = recv_raas_msg(&mut reader).unwrap();
assert_eq!(message.len() as u32, out_msg.len);
assert_eq!(message, out_msg.msg);
}
#[cfg(feature = "async")]
#[tokio::test]
async fn send_recv_test_raas_message() {
let mut msg_buffer = Vec::new();
let message = Vec::from(b"Hello World");
send_raas_msg(&mut msg_buffer, message.clone())
.await
.unwrap();
let mut reader = BufReader::new(msg_buffer.as_slice());
let out_msg = recv_raas_msg(&mut reader).await.unwrap();
assert_eq!(message.len() as u32, out_msg.len);
assert_eq!(message, out_msg.msg);
}
}