nrbf 0.2.2

A parser for the .NET Remoting Binary Format (NRBF).
Documentation
use nom::{
  IResult, Parser,
  branch::alt,
  combinator::{map, map_opt},
  number::complete::{le_u16, le_u24, le_u32, u8},
};

use super::impl_primitive;
use crate::{
  combinator::into_failure,
  enumeration::PrimitiveType,
  error::{Error, error_position},
};

/// 2.1.1.1 `Char`
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Char(pub char);

impl Char {
  pub fn parse(input: &[u8]) -> IResult<&[u8], Self, Error<'_>> {
    map(
      alt((
        map_opt(u8, |n| char::from_u32(n as u32)),
        map_opt(le_u16, |n| char::from_u32(n as u32)),
        map_opt(le_u24, char::from_u32),
        map_opt(le_u32, char::from_u32),
      )),
      Self,
    )
    .parse(input)
    .map_err(|err| {
      into_failure(err)
        .map(|err: nom::error::Error<&[u8]>| error_position!(err.input, ExpectedPrimitive(PrimitiveType::Char)))
    })
  }
}

impl_primitive!(Char, char, visit_char, deserialize_char);