1use crate::prelude::*;
2use crate::num::*;
3use super::{ stateless, util, Error, Input, Needle, Parser as _, ParserPhantom, Result, Success };
4
5pub trait ParserStateful<I, O, E = ()>
6where
7 I: Input
8{
9 fn parse(&mut self, input: I) -> Result<I, O, E>;
10
11 #[inline]
12 fn map<F, O2>(self, f: F) -> util::Map<Self, F, O>
13 where
14 Self: Sized,
15 F: FnMut(O) -> O2
16 {
17 util::map(self, f)
18 }
19}
20
21impl<F, I, O, E> ParserStateful<I, O, E> for F
22where
23 I: Input,
24 F: FnMut(I) -> Result<I, O, E>
25{
26 #[inline]
27 fn parse(&mut self, input: I) -> Result<I, O, E> {
28 self(input)
29 }
30}
31
32#[inline]
33pub fn delimited<P, I, O, E, EReal, PBefore, OBefore, EBefore, PAfter, OAfter, EAfter>(
34 parser_before: PBefore,
35 parser: P,
36 parser_after: PAfter
37) -> Delimited<P, I, O, E, EReal, PBefore, OBefore, EBefore, PAfter, OAfter, EAfter>
38where
39 I: Input,
40 PBefore: ParserStateful<I, OBefore, EBefore>,
41 P: ParserStateful<I, O, E>,
42 PAfter: ParserStateful<I, OAfter, EAfter>,
43 EBefore: Into<EReal>,
44 E: Into<EReal>,
45 EAfter: Into<EReal>
46{
47 Delimited {
48 parser_before,
49 parser,
50 parser_after,
51 __marker: PhantomData
52 }
53}
54
55macro_rules! decl_num_fn {
56 { $($(#[$meta:meta])* $struct:ident $fn:ident)* } => {
57 $(
58 $(#[$meta])*
59 #[inline]
60 pub fn $fn() -> $struct {
61 $struct { inner: stateless::$fn() }
62 }
63 )*
64 }
65}
66
67decl_num_fn! {
68 NumU8LE num_u8_le
69 NumU8BE num_u8_be
70 NumU8NE num_u8_ne
71
72 NumU16LE num_u16_le
73 NumU16BE num_u16_be
74 NumU16NE num_u16_ne
75
76 NumU32LE num_u32_le
77 NumU32BE num_u32_be
78 NumU32NE num_u32_ne
79
80 NumU64LE num_u64_le
81 NumU64BE num_u64_be
82 NumU64NE num_u64_ne
83
84 NumU128LE num_u128_le
85 NumU128BE num_u128_be
86 NumU128NE num_u128_ne
87
88 NumI8LE num_i8_le
89 NumI8BE num_i8_be
90 NumI8NE num_i8_ne
91
92 NumI16LE num_i16_le
93 NumI16BE num_i16_be
94 NumI16NE num_i16_ne
95
96 NumI32LE num_i32_le
97 NumI32BE num_i32_be
98 NumI32NE num_i32_ne
99
100 NumI64LE num_i64_le
101 NumI64BE num_i64_be
102 NumI64NE num_i64_ne
103
104 NumI128LE num_i128_le
105 NumI128BE num_i128_be
106 NumI128NE num_i128_ne
107
108 NumF32LE num_f32_le
109 NumF32BE num_f32_be
110 NumF32NE num_f32_ne
111
112 NumF64LE num_f64_le
113 NumF64BE num_f64_be
114 NumF64NE num_f64_ne
115
116 NumUsizeLE num_usize_le
117 NumUsizeBE num_usize_be
118 NumUsizeNE num_usize_ne
119 NumIsizeLE num_isize_le
120 NumIsizeBE num_isize_be
121 NumIsizeNE num_isize_ne
122}
123
124#[inline]
125pub fn tag<T>(tag: T) -> Tag<T> {
126 Tag { inner: stateless::tag(tag) }
127}
128
129#[inline]
130pub fn take<N>(amount: N) -> Take
131where
132 N: IntoUsize
133{
134 Take { inner: stateless::take(amount) }
135}
136
137#[inline]
138pub fn take_array<const N: usize>() -> TakeArray<N> {
139 TakeArray { inner: stateless::take_array() }
140}
141
142#[inline]
143pub fn take_const<const N: usize>() -> TakeConst<N> {
144 TakeConst { inner: stateless::take_const() }
145}
146
147#[inline]
148pub fn void<P, I, O, E>(parser: P) -> Void<P, I, O, E>
149where
150 I: Input,
151 P: ParserStateful<I, O, E>
152{
153 Void { parser, __marker: PhantomData }
154}
155
156#[expect(
157 clippy::type_complexity,
158 reason = "good naming makes it look alright I guess lol"
159)]
160pub struct Delimited<P, I, O, E, EReal, PBefore, OBefore, EBefore, PAfter, OAfter, EAfter>
161where
162 I: Input
163{
164 parser_before: PBefore,
165 parser: P,
166 parser_after: PAfter,
167 __marker: PhantomData<(
168 ParserPhantom<I, OBefore, EBefore>,
169 ParserPhantom<I, O, E>,
170 ParserPhantom<I, OAfter, EAfter>,
171 fn() -> EReal
172 )>
173}
174
175impl<P, I, O, E, EReal, PBefore, OBefore, EBefore, PAfter, OAfter, EAfter> ParserStateful<I, O, EReal>
176for Delimited<P, I, O, E, EReal, PBefore, OBefore, EBefore, PAfter, OAfter, EAfter>
177where
178 I: Input,
179 PBefore: ParserStateful<I, OBefore, EBefore>,
180 P: ParserStateful<I, O, E>,
181 PAfter: ParserStateful<I, OAfter, EAfter>,
182 EBefore: Into<EReal>,
183 E: Into<EReal>,
184 EAfter: Into<EReal>
185{
186 #[inline]
187 fn parse(&mut self, input: I) -> Result<I, O, EReal> {
188 let Success {
189 output: _output_before,
190 remaining_input: input
191 } = self.parser_before.parse(input).map_err(Error::into)?;
192
193 let Success {
194 output,
195 remaining_input: input
196 } = self.parser.parse(input).map_err(Error::into)?;
197
198 let Success {
199 output: _output_after,
200 remaining_input
201 } = self.parser_after.parse(input).map_err(Error::into)?;
202
203 Ok(Success { output, remaining_input })
204 }
205}
206
207macro_rules! decl_num_struct {
208 { $($(#[$meta:meta])* $num:ident $struct_le:ident $struct_be:ident $struct_ne:ident)* } => {
209 $(
210 decl_num_struct! { $(#[$meta])* $num $struct_le }
211 decl_num_struct! { $(#[$meta])* $num $struct_be }
212 decl_num_struct! { $(#[$meta])* $num $struct_ne }
213 )*
214 };
215
216 { $(#[$meta:meta])* $num:ident $struct:ident } => {
217 $(#[$meta])*
218 #[repr(transparent)]
219 pub struct $struct {
220 inner: stateless::$struct
221 }
222
223 $(#[$meta])*
224 impl<'h> ParserStateful<&'h [u8], $num> for $struct {
225 #[inline]
226 fn parse(&mut self, input: &'h [u8]) -> Result<&'h [u8], $num> {
227 self.inner.parse(input)
228 }
229 }
230 };
231}
232
233decl_num_struct! {
234 u8 NumU8LE NumU8BE NumU8NE
235 u16 NumU16LE NumU16BE NumU16NE
236 u32 NumU32LE NumU32BE NumU32NE
237 u64 NumU64LE NumU64BE NumU64NE
238 u128 NumU128LE NumU128BE NumU128NE
239
240 i8 NumI8LE NumI8BE NumI8NE
241 i16 NumI16LE NumI16BE NumI16NE
242 i32 NumI32LE NumI32BE NumI32NE
243 i64 NumI64LE NumI64BE NumI64NE
244 i128 NumI128LE NumI128BE NumI128NE
245
246 f32 NumF32LE NumF32BE NumF32NE
247 f64 NumF64LE NumF64BE NumF64NE
248
249 usize NumUsizeLE NumUsizeBE NumUsizeNE
250 isize NumIsizeLE NumIsizeBE NumIsizeNE
251}
252
253#[repr(transparent)]
254pub struct Tag<T> {
255 inner: stateless::Tag<T>
256}
257
258impl<I, T> ParserStateful<I, ()> for Tag<T>
259where
260 I: Input,
261 T: Needle<I>
262{
263 #[inline]
264 fn parse(&mut self, input: I) -> Result<I, ()> {
265 self.inner.parse(input)
266 }
267}
268
269#[repr(transparent)]
270pub struct Take {
271 inner: stateless::Take
272}
273
274impl<I> ParserStateful<I, I> for Take
275where
276 I: Input
277{
278 #[inline]
279 fn parse(&mut self, input: I) -> Result<I, I> {
280 self.inner.parse(input)
281 }
282}
283
284pub struct TakeArray<const N: usize> {
285 inner: stateless::TakeArray<N>
286}
287
288impl<I, const N: usize> ParserStateful<I, I::ConstSizeOwned<N>> for TakeArray<N>
289where
290 I: Input
291{
292 #[inline]
293 fn parse(&mut self, input: I) -> Result<I, I::ConstSizeOwned<N>> {
294 self.inner.parse(input)
295 }
296}
297
298#[repr(transparent)]
299pub struct TakeConst<const N: usize> {
300 inner: stateless::TakeConst<N>
301}
302
303impl<I, const N: usize> ParserStateful<I, I::ConstSize<N>> for TakeConst<N>
304where
305 I: Input
306{
307 #[inline]
308 fn parse(&mut self, input: I) -> Result<I, I::ConstSize<N>> {
309 self.inner.parse(input)
310 }
311}
312
313#[repr(transparent)]
314pub struct Void<P, I, O, E>
315where
316 I: Input
317{
318 parser: P,
319 __marker: ParserPhantom<I, O, E>
320}
321
322impl<P, I, O, E> ParserStateful<I, (), E> for Void<P, I, O, E>
323where
324 I: Input,
325 P: ParserStateful<I, O, E>
326{
327 #[inline]
328 fn parse(&mut self, input: I) -> Result<I, (), E> {
329 let Success { output: _void, remaining_input } = self.parser.parse(input)?;
330 Ok(Success { output: (), remaining_input })
331 }
332}