chia_sdk_types/condition/
messages.rs

1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum MessageSide {
3    Sender,
4    Receiver,
5}
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub struct MessageFlags {
9    pub parent: bool,
10    pub puzzle: bool,
11    pub amount: bool,
12}
13
14impl MessageFlags {
15    pub const NONE: Self = Self::new(false, false, false);
16    pub const PARENT: Self = Self::new(true, false, false);
17    pub const PUZZLE: Self = Self::new(false, true, false);
18    pub const AMOUNT: Self = Self::new(false, false, true);
19    pub const PARENT_PUZZLE: Self = Self::new(true, true, false);
20    pub const PARENT_AMOUNT: Self = Self::new(true, false, true);
21    pub const PUZZLE_AMOUNT: Self = Self::new(false, true, true);
22    pub const COIN: Self = Self::new(true, true, true);
23
24    pub const fn new(parent: bool, puzzle: bool, amount: bool) -> Self {
25        Self {
26            parent,
27            puzzle,
28            amount,
29        }
30    }
31
32    pub const fn decode(value: u8, side: MessageSide) -> Self {
33        match side {
34            MessageSide::Sender => Self::new(
35                value & 0b100_000 != 0,
36                value & 0b010_000 != 0,
37                value & 0b001_000 != 0,
38            ),
39            MessageSide::Receiver => Self::new(
40                value & 0b000_100 != 0,
41                value & 0b000_010 != 0,
42                value & 0b000_001 != 0,
43            ),
44        }
45    }
46
47    pub const fn encode(self, side: MessageSide) -> u8 {
48        match side {
49            MessageSide::Sender => {
50                (self.parent as u8) << 5 | (self.puzzle as u8) << 4 | (self.amount as u8) << 3
51            }
52            MessageSide::Receiver => {
53                (self.parent as u8) << 2 | (self.puzzle as u8) << 1 | (self.amount as u8)
54            }
55        }
56    }
57}