use nom::{IResult, Parser, combinator::map_res, number::complete::u8};
use super::impl_primitive;
use crate::{
combinator::into_failure,
enumeration::PrimitiveType,
error::{Error, error_position},
};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Boolean(pub bool);
impl Boolean {
pub fn parse(input: &[u8]) -> IResult<&[u8], Self, Error<'_>> {
map_res(u8, |byte| {
Ok(Self(match byte {
0 => false,
1 => true,
_ => return Err(()),
}))
})
.parse(input)
.map_err(|err| {
into_failure(err)
.map(|err: nom::error::Error<&[u8]>| error_position!(err.input, ExpectedPrimitive(PrimitiveType::Boolean)))
})
}
}
impl_primitive!(Boolean, bool, visit_bool, deserialize_bool);