gcode/
callbacks.rs

1use crate::{Comment, Mnemonic, Span, Word};
2
3#[allow(unused_imports)] // rustdoc links
4use crate::{buffers::Buffers, GCode};
5
6/// Callbacks used during the parsing process to indicate possible errors.
7pub trait Callbacks {
8    /// The parser encountered some text it wasn't able to make sense of.
9    fn unknown_content(&mut self, _text: &str, _span: Span) {}
10
11    /// The [`Buffers::Commands`] buffer had insufficient capacity when trying
12    /// to add a [`GCode`].
13    fn gcode_buffer_overflowed(
14        &mut self,
15        _mnemonic: Mnemonic,
16        _major_number: u32,
17        _minor_number: u32,
18        _arguments: &[Word],
19        _span: Span,
20    ) {
21    }
22
23    /// The [`Buffers::Arguments`] buffer had insufficient capacity when trying
24    /// to add a [`Word`].
25    ///
26    /// To aid in diagnostics, the caller is also given the [`GCode`]'s
27    /// mnemonic and major/minor numbers.
28    fn gcode_argument_buffer_overflowed(
29        &mut self,
30        _mnemonic: Mnemonic,
31        _major_number: u32,
32        _minor_number: u32,
33        _argument: Word,
34    ) {
35    }
36
37    /// A [`Comment`] was encountered, but there wasn't enough room in
38    /// [`Buffers::Comments`].
39    fn comment_buffer_overflow(&mut self, _comment: Comment<'_>) {}
40
41    /// A line number was encountered when it wasn't expected.
42    fn unexpected_line_number(&mut self, _line_number: f32, _span: Span) {}
43
44    /// An argument was found, but the parser couldn't figure out which
45    /// [`GCode`] it corresponds to.
46    fn argument_without_a_command(
47        &mut self,
48        _letter: char,
49        _value: f32,
50        _span: Span,
51    ) {
52    }
53
54    /// A [`Word`]'s number was encountered without an accompanying letter.
55    fn number_without_a_letter(&mut self, _value: &str, _span: Span) {}
56
57    /// A [`Word`]'s letter was encountered without an accompanying number.
58    fn letter_without_a_number(&mut self, _value: &str, _span: Span) {}
59}
60
61impl<'a, C: Callbacks + ?Sized> Callbacks for &'a mut C {
62    fn unknown_content(&mut self, text: &str, span: Span) {
63        (*self).unknown_content(text, span);
64    }
65
66    fn gcode_buffer_overflowed(
67        &mut self,
68        mnemonic: Mnemonic,
69        major_number: u32,
70        minor_number: u32,
71        arguments: &[Word],
72        span: Span,
73    ) {
74        (*self).gcode_buffer_overflowed(
75            mnemonic,
76            major_number,
77            minor_number,
78            arguments,
79            span,
80        );
81    }
82
83    fn gcode_argument_buffer_overflowed(
84        &mut self,
85        mnemonic: Mnemonic,
86        major_number: u32,
87        minor_number: u32,
88        argument: Word,
89    ) {
90        (*self).gcode_argument_buffer_overflowed(
91            mnemonic,
92            major_number,
93            minor_number,
94            argument,
95        );
96    }
97
98    fn comment_buffer_overflow(&mut self, comment: Comment<'_>) {
99        (*self).comment_buffer_overflow(comment);
100    }
101
102    fn unexpected_line_number(&mut self, line_number: f32, span: Span) {
103        (*self).unexpected_line_number(line_number, span);
104    }
105
106    fn argument_without_a_command(
107        &mut self,
108        letter: char,
109        value: f32,
110        span: Span,
111    ) {
112        (*self).argument_without_a_command(letter, value, span);
113    }
114
115    fn number_without_a_letter(&mut self, value: &str, span: Span) {
116        (*self).number_without_a_letter(value, span);
117    }
118
119    fn letter_without_a_number(&mut self, value: &str, span: Span) {
120        (*self).letter_without_a_number(value, span);
121    }
122}
123
124/// A set of callbacks that ignore any errors that occur.
125#[derive(Debug, Copy, Clone, PartialEq, Default)]
126pub struct Nop;
127
128impl Callbacks for Nop {}