use winnow::{Parser, token::take};
use super::{Input, PResult};
use crate::message::EndianSig;
pub(super) trait ByteOrder {
const ENDIAN_SIG: EndianSig;
fn u32_from_bytes(bytes: [u8; 4]) -> u32;
#[inline(always)]
fn u32(input: &mut Input<'_>) -> PResult<u32> {
take(4usize)
.map(|bytes: &[u8]| {
Self::u32_from_bytes(bytes.try_into().expect("`take` returns 4 bytes"))
})
.parse_next(input)
}
}
pub(super) enum LittleEndian {}
impl ByteOrder for LittleEndian {
const ENDIAN_SIG: EndianSig = EndianSig::Little;
#[inline(always)]
fn u32_from_bytes(bytes: [u8; 4]) -> u32 {
u32::from_le_bytes(bytes)
}
}
pub(super) enum BigEndian {}
impl ByteOrder for BigEndian {
const ENDIAN_SIG: EndianSig = EndianSig::Big;
#[inline(always)]
fn u32_from_bytes(bytes: [u8; 4]) -> u32 {
u32::from_be_bytes(bytes)
}
}