1use bincode::config::DefaultOptions;
2use bincode::Options;
3
4use crate::error::{EnigmaPacketError, Result};
5use crate::framing::{encode_frame, parse_frame};
6use crate::types::Message;
7use crate::validate::validate_message;
8
9fn bincode_options() -> impl Options {
10 DefaultOptions::new().with_fixint_encoding()
11}
12
13pub fn encode_message(message: &Message) -> Result<Vec<u8>> {
14 validate_message(message)?;
15 let body = bincode_options()
16 .serialize(message)
17 .map_err(|e| EnigmaPacketError::InvalidPacket(e.to_string()))?;
18 encode_frame(&body, 0)
19}
20
21pub fn decode_message(packet: &[u8]) -> Result<Message> {
22 let view = parse_frame(packet)?;
23 let message: Message = bincode_options()
24 .deserialize(view.body)
25 .map_err(|e| EnigmaPacketError::DecodeError(e.to_string()))?;
26 validate_message(&message)?;
27 Ok(message)
28}