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}