Skip to main content

dlp_api/args/
types.rs

1use std::ops::Deref;
2
3use bytemuck::{Pod, Zeroable};
4use pinocchio::error::ProgramError;
5
6use crate::{pod_view::PodView, require_ge};
7
8///
9/// Boolean
10///
11#[repr(C)]
12#[derive(Copy, Clone, Pod, Zeroable, Default)]
13pub struct Boolean(u8);
14
15impl Boolean {
16    pub fn is_true(&self) -> bool {
17        // any non-zero is true
18        self.0 != 0
19    }
20    pub fn is_false(&self) -> bool {
21        self.0 == 0
22    }
23}
24
25impl From<bool> for Boolean {
26    fn from(value: bool) -> Self {
27        Self(if value { 1 } else { 0 })
28    }
29}
30
31///
32/// ArgsWithBuffer
33///
34pub struct ArgsWithBuffer<'a, Header> {
35    header: &'a Header,
36    pub buffer: &'a [u8],
37}
38
39impl<'a, Header: PodView> ArgsWithBuffer<'a, Header> {
40    pub fn from_bytes(input: &'a [u8]) -> Result<Self, ProgramError> {
41        require_ge!(
42            input.len(),
43            Header::SPACE,
44            ProgramError::InvalidInstructionData
45        );
46
47        let (header_bytes, buffer) = input.split_at(Header::SPACE);
48
49        Ok(Self {
50            header: Header::try_view_from(header_bytes)?,
51            buffer,
52        })
53    }
54}
55
56impl<H> Deref for ArgsWithBuffer<'_, H> {
57    type Target = H;
58    fn deref(&self) -> &Self::Target {
59        self.header
60    }
61}