1use crate::decoder::Encoding;
2use crate::ErrorSink;
3use crate::ParseError;
4use crate::Source;
5use crate::Span;
6
7pub trait EventReceiver {
8 fn std_table_open(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
9 fn std_table_close(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
10 fn array_table_open(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
11 fn array_table_close(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
12 #[must_use]
14 fn inline_table_open(&mut self, _span: Span, _error: &mut dyn ErrorSink) -> bool {
15 true
16 }
17 fn inline_table_close(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
18 #[must_use]
20 fn array_open(&mut self, _span: Span, _error: &mut dyn ErrorSink) -> bool {
21 true
22 }
23 fn array_close(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
24 fn simple_key(&mut self, _span: Span, _kind: Option<Encoding>, _error: &mut dyn ErrorSink) {}
25 fn key_sep(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
26 fn key_val_sep(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
27 fn scalar(&mut self, _span: Span, _kind: Option<Encoding>, _error: &mut dyn ErrorSink) {}
28 fn value_sep(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
29 fn whitespace(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
30 fn comment(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
31 fn newline(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
32 fn error(&mut self, _span: Span, _error: &mut dyn ErrorSink) {}
33}
34
35impl<F> EventReceiver for F
36where
37 F: FnMut(Event),
38{
39 fn std_table_open(&mut self, span: Span, _error: &mut dyn ErrorSink) {
40 (self)(Event {
41 kind: EventKind::StdTableOpen,
42 encoding: None,
43 span,
44 });
45 }
46 fn std_table_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
47 (self)(Event {
48 kind: EventKind::StdTableClose,
49 encoding: None,
50 span,
51 });
52 }
53 fn array_table_open(&mut self, span: Span, _error: &mut dyn ErrorSink) {
54 (self)(Event {
55 kind: EventKind::ArrayTableOpen,
56 encoding: None,
57 span,
58 });
59 }
60 fn array_table_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
61 (self)(Event {
62 kind: EventKind::ArrayTableClose,
63 encoding: None,
64 span,
65 });
66 }
67 fn inline_table_open(&mut self, span: Span, _error: &mut dyn ErrorSink) -> bool {
68 (self)(Event {
69 kind: EventKind::InlineTableOpen,
70 encoding: None,
71 span,
72 });
73 true
74 }
75 fn inline_table_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
76 (self)(Event {
77 kind: EventKind::InlineTableClose,
78 encoding: None,
79 span,
80 });
81 }
82 fn array_open(&mut self, span: Span, _error: &mut dyn ErrorSink) -> bool {
83 (self)(Event {
84 kind: EventKind::ArrayOpen,
85 encoding: None,
86 span,
87 });
88 true
89 }
90 fn array_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
91 (self)(Event {
92 kind: EventKind::ArrayClose,
93 encoding: None,
94 span,
95 });
96 }
97 fn simple_key(&mut self, span: Span, encoding: Option<Encoding>, _error: &mut dyn ErrorSink) {
98 (self)(Event {
99 kind: EventKind::SimpleKey,
100 encoding,
101 span,
102 });
103 }
104 fn key_sep(&mut self, span: Span, _error: &mut dyn ErrorSink) {
105 (self)(Event {
106 kind: EventKind::KeySep,
107 encoding: None,
108 span,
109 });
110 }
111 fn key_val_sep(&mut self, span: Span, _error: &mut dyn ErrorSink) {
112 (self)(Event {
113 kind: EventKind::KeyValSep,
114 encoding: None,
115 span,
116 });
117 }
118 fn scalar(&mut self, span: Span, encoding: Option<Encoding>, _error: &mut dyn ErrorSink) {
119 (self)(Event {
120 kind: EventKind::Scalar,
121 encoding,
122 span,
123 });
124 }
125 fn value_sep(&mut self, span: Span, _error: &mut dyn ErrorSink) {
126 (self)(Event {
127 kind: EventKind::ValueSep,
128 encoding: None,
129 span,
130 });
131 }
132 fn whitespace(&mut self, span: Span, _error: &mut dyn ErrorSink) {
133 (self)(Event {
134 kind: EventKind::Whitespace,
135 encoding: None,
136 span,
137 });
138 }
139 fn comment(&mut self, span: Span, _error: &mut dyn ErrorSink) {
140 (self)(Event {
141 kind: EventKind::Comment,
142 encoding: None,
143 span,
144 });
145 }
146 fn newline(&mut self, span: Span, _error: &mut dyn ErrorSink) {
147 (self)(Event {
148 kind: EventKind::Newline,
149 encoding: None,
150 span,
151 });
152 }
153 fn error(&mut self, span: Span, _error: &mut dyn ErrorSink) {
154 (self)(Event {
155 kind: EventKind::Error,
156 encoding: None,
157 span,
158 });
159 }
160}
161
162#[cfg(feature = "alloc")]
163#[allow(unused_qualifications)]
164impl EventReceiver for alloc::vec::Vec<Event> {
165 fn std_table_open(&mut self, span: Span, _error: &mut dyn ErrorSink) {
166 self.push(Event {
167 kind: EventKind::StdTableOpen,
168 encoding: None,
169 span,
170 });
171 }
172 fn std_table_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
173 self.push(Event {
174 kind: EventKind::StdTableClose,
175 encoding: None,
176 span,
177 });
178 }
179 fn array_table_open(&mut self, span: Span, _error: &mut dyn ErrorSink) {
180 self.push(Event {
181 kind: EventKind::ArrayTableOpen,
182 encoding: None,
183 span,
184 });
185 }
186 fn array_table_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
187 self.push(Event {
188 kind: EventKind::ArrayTableClose,
189 encoding: None,
190 span,
191 });
192 }
193 fn inline_table_open(&mut self, span: Span, _error: &mut dyn ErrorSink) -> bool {
194 self.push(Event {
195 kind: EventKind::InlineTableOpen,
196 encoding: None,
197 span,
198 });
199 true
200 }
201 fn inline_table_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
202 self.push(Event {
203 kind: EventKind::InlineTableClose,
204 encoding: None,
205 span,
206 });
207 }
208 fn array_open(&mut self, span: Span, _error: &mut dyn ErrorSink) -> bool {
209 self.push(Event {
210 kind: EventKind::ArrayOpen,
211 encoding: None,
212 span,
213 });
214 true
215 }
216 fn array_close(&mut self, span: Span, _error: &mut dyn ErrorSink) {
217 self.push(Event {
218 kind: EventKind::ArrayClose,
219 encoding: None,
220 span,
221 });
222 }
223 fn simple_key(&mut self, span: Span, encoding: Option<Encoding>, _error: &mut dyn ErrorSink) {
224 self.push(Event {
225 kind: EventKind::SimpleKey,
226 encoding,
227 span,
228 });
229 }
230 fn key_sep(&mut self, span: Span, _error: &mut dyn ErrorSink) {
231 self.push(Event {
232 kind: EventKind::KeySep,
233 encoding: None,
234 span,
235 });
236 }
237 fn key_val_sep(&mut self, span: Span, _error: &mut dyn ErrorSink) {
238 self.push(Event {
239 kind: EventKind::KeyValSep,
240 encoding: None,
241 span,
242 });
243 }
244 fn scalar(&mut self, span: Span, encoding: Option<Encoding>, _error: &mut dyn ErrorSink) {
245 self.push(Event {
246 kind: EventKind::Scalar,
247 encoding,
248 span,
249 });
250 }
251 fn value_sep(&mut self, span: Span, _error: &mut dyn ErrorSink) {
252 self.push(Event {
253 kind: EventKind::ValueSep,
254 encoding: None,
255 span,
256 });
257 }
258 fn whitespace(&mut self, span: Span, _error: &mut dyn ErrorSink) {
259 self.push(Event {
260 kind: EventKind::Whitespace,
261 encoding: None,
262 span,
263 });
264 }
265 fn comment(&mut self, span: Span, _error: &mut dyn ErrorSink) {
266 self.push(Event {
267 kind: EventKind::Comment,
268 encoding: None,
269 span,
270 });
271 }
272 fn newline(&mut self, span: Span, _error: &mut dyn ErrorSink) {
273 self.push(Event {
274 kind: EventKind::Newline,
275 encoding: None,
276 span,
277 });
278 }
279 fn error(&mut self, span: Span, _error: &mut dyn ErrorSink) {
280 self.push(Event {
281 kind: EventKind::Error,
282 encoding: None,
283 span,
284 });
285 }
286}
287
288impl EventReceiver for () {}
289
290pub struct ValidateWhitespace<'r, 's> {
292 receiver: &'r mut dyn EventReceiver,
293 source: Source<'s>,
294}
295
296impl<'r, 's> ValidateWhitespace<'r, 's> {
297 pub fn new(receiver: &'r mut dyn EventReceiver, source: Source<'s>) -> Self {
298 Self { receiver, source }
299 }
300}
301
302impl EventReceiver for ValidateWhitespace<'_, '_> {
303 fn std_table_open(&mut self, span: Span, error: &mut dyn ErrorSink) {
304 self.receiver.std_table_open(span, error);
305 }
306 fn std_table_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
307 self.receiver.std_table_close(span, error);
308 }
309 fn array_table_open(&mut self, span: Span, error: &mut dyn ErrorSink) {
310 self.receiver.array_table_open(span, error);
311 }
312 fn array_table_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
313 self.receiver.array_table_close(span, error);
314 }
315 fn inline_table_open(&mut self, span: Span, error: &mut dyn ErrorSink) -> bool {
316 self.receiver.inline_table_open(span, error)
317 }
318 fn inline_table_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
319 self.receiver.inline_table_close(span, error);
320 }
321 fn array_open(&mut self, span: Span, error: &mut dyn ErrorSink) -> bool {
322 self.receiver.array_open(span, error)
323 }
324 fn array_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
325 self.receiver.array_close(span, error);
326 }
327 fn simple_key(&mut self, span: Span, encoding: Option<Encoding>, error: &mut dyn ErrorSink) {
328 self.receiver.simple_key(span, encoding, error);
329 }
330 fn key_sep(&mut self, span: Span, error: &mut dyn ErrorSink) {
331 self.receiver.key_sep(span, error);
332 }
333 fn key_val_sep(&mut self, span: Span, error: &mut dyn ErrorSink) {
334 self.receiver.key_val_sep(span, error);
335 }
336 fn scalar(&mut self, span: Span, encoding: Option<Encoding>, error: &mut dyn ErrorSink) {
337 self.receiver.scalar(span, encoding, error);
338 }
339 fn value_sep(&mut self, span: Span, error: &mut dyn ErrorSink) {
340 self.receiver.value_sep(span, error);
341 }
342 fn whitespace(&mut self, span: Span, error: &mut dyn ErrorSink) {
343 #[cfg(feature = "unsafe")] let raw = unsafe { self.source.get_unchecked(span) };
345 #[cfg(not(feature = "unsafe"))]
346 let raw = self.source.get(span).expect("token spans are valid");
347 raw.decode_whitespace(error);
348
349 self.receiver.whitespace(span, error);
350 }
351 fn comment(&mut self, span: Span, error: &mut dyn ErrorSink) {
352 #[cfg(feature = "unsafe")] let raw = unsafe { self.source.get_unchecked(span) };
354 #[cfg(not(feature = "unsafe"))]
355 let raw = self.source.get(span).expect("token spans are valid");
356 raw.decode_comment(error);
357
358 self.receiver.comment(span, error);
359 }
360 fn newline(&mut self, span: Span, error: &mut dyn ErrorSink) {
361 #[cfg(feature = "unsafe")] let raw = unsafe { self.source.get_unchecked(span) };
363 #[cfg(not(feature = "unsafe"))]
364 let raw = self.source.get(span).expect("token spans are valid");
365 raw.decode_newline(error);
366
367 self.receiver.newline(span, error);
368 }
369 fn error(&mut self, span: Span, error: &mut dyn ErrorSink) {
370 self.receiver.error(span, error);
371 }
372}
373
374pub struct RecursionGuard<'r> {
375 receiver: &'r mut dyn EventReceiver,
376 max_depth: u32,
377 depth: i64,
378}
379
380impl<'r> RecursionGuard<'r> {
381 pub fn new(receiver: &'r mut dyn EventReceiver, max_depth: u32) -> Self {
382 Self {
383 receiver,
384 max_depth,
385 depth: 0,
386 }
387 }
388
389 fn within_depth(&self) -> bool {
390 self.depth <= self.max_depth as i64
391 }
392}
393
394impl EventReceiver for RecursionGuard<'_> {
395 fn std_table_open(&mut self, span: Span, error: &mut dyn ErrorSink) {
396 self.receiver.std_table_open(span, error);
397 }
398 fn std_table_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
399 self.receiver.std_table_close(span, error);
400 }
401 fn array_table_open(&mut self, span: Span, error: &mut dyn ErrorSink) {
402 self.receiver.array_table_open(span, error);
403 }
404 fn array_table_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
405 self.receiver.array_table_close(span, error);
406 }
407 fn inline_table_open(&mut self, span: Span, error: &mut dyn ErrorSink) -> bool {
408 let allowed = self.receiver.inline_table_open(span, error);
409 self.depth += 1;
410 let within_depth = self.within_depth();
411 if allowed && !within_depth {
412 error.report_error(
413 ParseError::new("cannot recurse further; max recursion depth met")
414 .with_unexpected(span),
415 );
416 }
417 allowed && within_depth
418 }
419 fn inline_table_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
420 self.depth -= 1;
421 self.receiver.inline_table_close(span, error);
422 }
423 fn array_open(&mut self, span: Span, error: &mut dyn ErrorSink) -> bool {
424 let allowed = self.receiver.array_open(span, error);
425 self.depth += 1;
426 let within_depth = self.within_depth();
427 if allowed && !within_depth {
428 error.report_error(
429 ParseError::new("cannot recurse further; max recursion depth met")
430 .with_unexpected(span),
431 );
432 }
433 allowed && within_depth
434 }
435 fn array_close(&mut self, span: Span, error: &mut dyn ErrorSink) {
436 self.depth -= 1;
437 self.receiver.array_close(span, error);
438 }
439 fn simple_key(&mut self, span: Span, encoding: Option<Encoding>, error: &mut dyn ErrorSink) {
440 self.receiver.simple_key(span, encoding, error);
441 }
442 fn key_sep(&mut self, span: Span, error: &mut dyn ErrorSink) {
443 self.receiver.key_sep(span, error);
444 }
445 fn key_val_sep(&mut self, span: Span, error: &mut dyn ErrorSink) {
446 self.receiver.key_val_sep(span, error);
447 }
448 fn scalar(&mut self, span: Span, encoding: Option<Encoding>, error: &mut dyn ErrorSink) {
449 self.receiver.scalar(span, encoding, error);
450 }
451 fn value_sep(&mut self, span: Span, error: &mut dyn ErrorSink) {
452 self.receiver.value_sep(span, error);
453 }
454 fn whitespace(&mut self, span: Span, error: &mut dyn ErrorSink) {
455 self.receiver.whitespace(span, error);
456 }
457 fn comment(&mut self, span: Span, error: &mut dyn ErrorSink) {
458 self.receiver.comment(span, error);
459 }
460 fn newline(&mut self, span: Span, error: &mut dyn ErrorSink) {
461 self.receiver.newline(span, error);
462 }
463 fn error(&mut self, span: Span, error: &mut dyn ErrorSink) {
464 self.receiver.error(span, error);
465 }
466}
467
468#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
469pub struct Event {
470 kind: EventKind,
471 encoding: Option<Encoding>,
472 span: Span,
473}
474
475impl Event {
476 pub fn new_unchecked(kind: EventKind, encoding: Option<Encoding>, span: Span) -> Self {
477 Self {
478 kind,
479 encoding,
480 span,
481 }
482 }
483
484 #[inline(always)]
485 pub fn kind(&self) -> EventKind {
486 self.kind
487 }
488
489 #[inline(always)]
490 pub fn encoding(&self) -> Option<Encoding> {
491 self.encoding
492 }
493
494 #[inline(always)]
495 pub fn span(&self) -> Span {
496 self.span
497 }
498}
499
500#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)]
501pub enum EventKind {
502 StdTableOpen,
503 StdTableClose,
504 ArrayTableOpen,
505 ArrayTableClose,
506 InlineTableOpen,
507 InlineTableClose,
508 ArrayOpen,
509 ArrayClose,
510 SimpleKey,
511 KeySep,
512 KeyValSep,
513 Scalar,
514 ValueSep,
515 Whitespace,
516 Comment,
517 Newline,
518 Error,
519}
520
521impl EventKind {
522 pub const fn description(&self) -> &'static str {
523 match self {
524 Self::StdTableOpen => "std-table open",
525 Self::StdTableClose => "std-table close",
526 Self::ArrayTableOpen => "array-table open",
527 Self::ArrayTableClose => "array-table close",
528 Self::InlineTableOpen => "inline-table open",
529 Self::InlineTableClose => "inline-table close",
530 Self::ArrayOpen => "array open",
531 Self::ArrayClose => "array close",
532 Self::SimpleKey => "key",
533 Self::KeySep => "key separator",
534 Self::KeyValSep => "key-value separator",
535 Self::Scalar => "value",
536 Self::ValueSep => "value separator",
537 Self::Whitespace => "whitespace",
538 Self::Comment => "comment",
539 Self::Newline => "newline",
540 Self::Error => "error",
541 }
542 }
543}