hpl_toolkit/compression/
traits.rs

1use 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}