1use std::ops::Deref;
2
3use bytemuck::{Pod, Zeroable};
4use pinocchio::error::ProgramError;
5
6use crate::{pod_view::PodView, require_ge};
7
8#[repr(C)]
12#[derive(Copy, Clone, Pod, Zeroable, Default)]
13pub struct Boolean(u8);
14
15impl Boolean {
16 pub fn is_true(&self) -> bool {
17 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
31pub 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}