use binator_base::octet;
use binator_core::{
Contexting,
CoreAtom,
Parse,
Parsed,
Streaming,
};
use binator_utils::{
Utils,
UtilsAtom,
};
use paste::paste;
pub trait NumberParse<Stream, Context> = where
Stream: Streaming + Eq,
<Stream as Streaming>::Item: Into<u8>,
Context: Contexting<UtilsAtom<Stream>>,
Context: Contexting<CoreAtom<Stream>>;
macro_rules! impl_primitive {
($primitive:ident) => {
paste! {
#[cfg_attr(
feature = "tracing",
tracing::instrument(level = "trace", skip_all, ret(Display))
)]
pub fn [<$primitive _be>]<Stream, Context>(
stream: Stream,
) -> Parsed<$primitive, Stream, Context>
where
(): NumberParse<Stream, Context>,
{
octet.fill().map($primitive::from_be_bytes).parse(stream)
}
#[cfg_attr(
feature = "tracing",
tracing::instrument(level = "trace", skip_all, ret(Display))
)]
pub fn [<$primitive _le>]<Stream, Context>(
stream: Stream,
) -> Parsed<$primitive, Stream, Context>
where
(): NumberParse<Stream, Context>,
{
octet.fill().map($primitive::from_le_bytes).parse(stream)
}
#[cfg_attr(
feature = "tracing",
tracing::instrument(level = "trace", skip_all, ret(Display))
)]
pub fn [<$primitive _ne>]<Stream, Context>(
stream: Stream,
) -> Parsed<$primitive, Stream, Context>
where
(): NumberParse<Stream, Context>,
{
octet.fill().map($primitive::from_ne_bytes).parse(stream)
}
}
};
}
macro_rules! impl_primitives {
($($primitives:ident,)*) => {
$(impl_primitive!{$primitives})*
};
}
impl_primitives!(
u16, u32, u64, u128, i16, i32, i64, i128, f32, f64, usize, isize,
);