Skip to main content

delta_pack/
delta_pack.rs

1use crate::{Decoder, Encoder, SyncSession};
2
3/// Common surface shared by every `delta-pack`-encodable type, whether produced
4/// by the CLI's Rust codegen or the `#[derive(DeltaPack)]` proc-macro.
5///
6/// Implementers provide the core serialization primitives (`encode_into`,
7/// `decode_from`, the diff `_into`/`_from` variants, and `equals`). The
8/// whole-value entry points (`encode`, `decode`, `encode_diff`, `decode_diff`)
9/// have default implementations: `encode_diff` forwards to `encode_diff_into`,
10/// which is the right shape for enums and unions. Structs override
11/// `encode_diff`/`decode_diff` to wrap in `push_object_diff` /
12/// `next_object_diff`, since object diffs carry a per-object change bit.
13pub trait DeltaPack: Sized {
14    #[must_use]
15    fn equals(&self, other: &Self) -> bool;
16
17    fn encode_into(&self, encoder: &mut Encoder);
18    fn decode_from(decoder: &mut Decoder) -> Self;
19
20    fn encode_diff_into(a: &Self, b: &Self, encoder: &mut Encoder);
21    fn decode_diff_from(obj: &Self, decoder: &mut Decoder) -> Self;
22
23    #[must_use]
24    fn encode(&self) -> Vec<u8> {
25        Encoder::encode(|encoder| {
26            self.encode_into(encoder);
27            encoder.finish()
28        })
29    }
30
31    #[must_use]
32    fn decode(buf: &[u8]) -> Self {
33        Decoder::decode(buf, |decoder| Self::decode_from(decoder))
34    }
35
36    #[must_use]
37    fn encode_diff(a: &Self, b: &Self) -> Vec<u8> {
38        Encoder::encode(|encoder| {
39            Self::encode_diff_into(a, b, encoder);
40            encoder.finish()
41        })
42    }
43
44    #[must_use]
45    fn decode_diff(obj: &Self, diff: &[u8]) -> Self {
46        Decoder::decode(diff, |decoder| Self::decode_diff_from(obj, decoder))
47    }
48
49    /// Construct a [`SyncSession`] for this type — the recommended handle for
50    /// state sync streams. Only available when `Self: Clone`, which generated
51    /// and `#[derive(DeltaPack)]` types satisfy by convention.
52    #[must_use]
53    fn create_sync_session() -> SyncSession<Self>
54    where
55        Self: Clone,
56    {
57        SyncSession::new()
58    }
59}