ktrs_parser/parsing/
optional_marker.rs1use ktrs_syntax::SyntaxKind;
4
5use super::Parser;
6use crate::builder::Marker;
7
8pub struct OptionalMarker {
9 marker: Option<Marker>,
10 offset: i32,
11}
12
13impl OptionalMarker {
14 pub fn new(p: &mut Parser, actually_mark: bool) -> OptionalMarker {
15 let marker = actually_mark.then(|| p.mark());
16 OptionalMarker { marker, offset: p.my_builder.get_current_offset() }
17 }
18
19 pub fn done(&self, p: &mut Parser, element_type: SyntaxKind) {
20 let Some(marker) = self.marker else { return };
21 marker.done(p, element_type);
22 }
23
24 pub fn error(&self, p: &mut Parser, message: &str) {
25 let Some(marker) = self.marker else { return };
26 if self.offset == p.my_builder.get_current_offset() {
27 marker.drop(p); } else {
29 marker.error(p, message);
30 }
31 }
32
33 pub fn drop(&self, p: &mut Parser) {
34 let Some(marker) = self.marker else { return };
35 marker.drop(p);
36 }
37}