wiwi/parser/
stateful.rs

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}