Skip to main content

bounded_codec/
bounded_codec.rs

1//! Encodes and decodes one manually defined protocol under explicit limits.
2
3use 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}