41 lines
1.0 KiB
Rust
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)
|
|
}
|