hpl_toolkit/compression/
traits.rs1use super::{CompressedDataEvent, CompressedDataEventStream};
2use crate::schema::ToSchema;
3use anchor_lang::prelude::{AccountInfo, AnchorDeserialize, AnchorSerialize, Key, Program, Result};
4use hpl_toolkit_macro_merkle_tree_apply_fn_deep::merkle_tree_apply_fn_deep;
5
6pub trait ToNode {
7 fn to_node(&self) -> [u8; 32];
8}
9
10pub trait CompressedData {
11 fn event_stream(&self) -> CompressedDataEventStream
12 where
13 Self: AnchorSerialize + ToSchema,
14 {
15 CompressedDataEventStream::Full {
16 data: self.schema_value(),
17 }
18 }
19
20 fn emit<'info>(
21 &self,
22 slot: u64,
23 leaf_idx: u32,
24 merkle_tree: &AccountInfo<'info>,
25 log_wrapper: &Program<'info, spl_account_compression::Noop>,
26 seq_offset: u64,
27 ) -> Result<()>
28 where
29 Self: AnchorSerialize + ToSchema,
30 {
31 let merkle_tree_bytes = merkle_tree.try_borrow_data()?;
32 CompressedDataEvent::Leaf {
33 slot,
34 tree_id: merkle_tree.key().to_bytes(),
35 leaf_idx,
36 seq: super::merkle_tree_apply_fn!(merkle_tree_bytes get_seq) + 1 + seq_offset,
37 stream_type: self.event_stream(),
38 }
39 .wrap(log_wrapper)
40 }
41}
42
43pub trait CompressedDataChunk {
44 const KEY: &'static str;
45
46 fn event_stream(&self) -> CompressedDataEventStream
47 where
48 Self: AnchorSerialize + ToSchema,
49 {
50 CompressedDataEventStream::PatchChunk {
51 key: Self::KEY.to_string(),
52 data: self.schema_value(),
53 }
54 }
55
56 fn emit<'info>(
57 &self,
58 slot: u64,
59 leaf_idx: u32,
60 merkle_tree: &AccountInfo<'info>,
61 log_wrapper: &Program<'info, spl_account_compression::Noop>,
62 seq_offset: u64,
63 ) -> Result<()>
64 where
65 Self: AnchorSerialize + ToSchema,
66 {
67 let merkle_tree_bytes = merkle_tree.try_borrow_data()?;
68 CompressedDataEvent::Leaf {
69 slot,
70 tree_id: merkle_tree.key().to_bytes(),
71 leaf_idx,
72 seq: super::merkle_tree_apply_fn!(merkle_tree_bytes get_seq) + 1 + seq_offset,
73 stream_type: self.event_stream(),
74 }
75 .wrap(log_wrapper)
76 }
77}