cuisiner/util/
boolean.rs

1use std::ops::Deref;
2
3use crate::{ByteOrder, Cuisiner, CuisinerError};
4
5/// A boolean value represented with some number of bytes, where non-zero is true, and zero is
6/// false.
7#[derive(Clone, Copy, Debug)]
8pub struct ByteBoolean<const N: usize = 1>(bool);
9
10impl<const N: usize> Cuisiner for ByteBoolean<N> {
11    type Raw<B: ByteOrder> = [u8; N];
12
13    fn try_from_raw<B: ByteOrder>(raw: Self::Raw<B>) -> Result<Self, CuisinerError> {
14        let all_zero = raw.into_iter().all(|n| n == 0);
15        Ok(Self(!all_zero))
16    }
17
18    fn try_to_raw<B: ByteOrder>(self) -> Result<Self::Raw<B>, CuisinerError> {
19        Ok([if *self { 0xff } else { 0x00 }; N])
20    }
21}
22
23impl<const N: usize> Deref for ByteBoolean<N> {
24    type Target = bool;
25
26    fn deref(&self) -> &Self::Target {
27        &self.0
28    }
29}