bounded_codec/
bounded_codec.rs1use native_ipc_core::codec::{
4 DecodeContext, DecodeError, EncodeError, Envelope, Limits, Protocol, decode_message,
5 encode_message,
6};
7
8struct CounterProtocol;
9
10impl Protocol for CounterProtocol {
11 type Message = u32;
12
13 const SCHEMA_ID: [u8; 32] = [0x43; 32];
14
15 fn encode_payload(
16 message: &Self::Message,
17 destination: &mut [u8],
18 ) -> Result<usize, EncodeError> {
19 if destination.len() < 4 {
20 return Err(EncodeError::DestinationTooSmall {
21 required: 4,
22 actual: destination.len(),
23 });
24 }
25 destination[..4].copy_from_slice(&message.to_le_bytes());
26 Ok(4)
27 }
28
29 fn decode_payload(
30 source: &[u8],
31 _context: &mut DecodeContext<'_>,
32 ) -> Result<Self::Message, DecodeError> {
33 let encoded: [u8; 4] = source.try_into().map_err(|_| DecodeError::Protocol(1))?;
34 Ok(u32::from_le_bytes(encoded))
35 }
36}
37
38fn main() -> Result<(), Box<dyn std::error::Error>> {
39 let mut wire = [0_u8; 128];
40 let written = encode_message::<CounterProtocol>(Envelope::new(1, 0, 7, 1), &42, &mut wire)?;
41
42 let limits = Limits::new(128, 16, 1, 16);
43 let decoded = decode_message::<CounterProtocol>(&wire[..written], &limits)?;
44
45 assert_eq!(decoded.message, 42);
46 assert_eq!(decoded.envelope.generation, 7);
47 println!(
48 "decoded counter {} from {} bounded bytes",
49 decoded.message, written
50 );
51 Ok(())
52}