2024-07-04 16:50:28 +08:00

41 lines
1.0 KiB
Rust

mod message;
pub use message::*;
use prost::Message;
use sdlan_sn_rs::utils::Result;
// tcp message has two-byte of size at header
pub fn encode_to_tcp_message<T: Message>(
msg: Option<T>,
packet_id: u32,
packet_type: u8,
) -> Result<Vec<u8>> {
let mut raw_data = Vec::new();
if let Some(msg) = msg {
msg.encode(&mut raw_data)?;
}
let mut result = Vec::with_capacity(raw_data.len() + 7);
let size = u16::to_be_bytes(raw_data.len() as u16 + 5);
result.extend_from_slice(&size);
result.extend_from_slice(&u32::to_be_bytes(packet_id));
result.push(packet_type);
result.extend_from_slice(&raw_data);
Ok(result)
}
// udp message has no two-byte of size at header
pub fn encode_to_udp_message<T: Message>(msg: Option<T>, packet_type: u8) -> Result<Vec<u8>> {
let mut raw_data = Vec::new();
if let Some(msg) = msg {
msg.encode(&mut raw_data)?;
}
let mut result = Vec::with_capacity(raw_data.len() + 1);
result.push(packet_type);
result.extend_from_slice(&raw_data);
Ok(result)
}