Minimal Imperative Parsing Library | https://docs.rs/mipl
1//! Delimiters for the lexer.
2use std::collections::HashSet;
3use std::iter::FromIterator;
4
5pub trait Inner {
6 fn new_with_inner(v: HashSet<char>) -> Self;
7 fn inner(&self) -> &HashSet<char>;
8}
9/// The interface of [DiscardDelimiters] and
10/// [KeepDelimiters].
11pub trait Delimiters: Inner + Sized {
12 /// Construct a new set of delimiters from
13 /// a list of characters.
14 fn new(vec: Vec<char>) -> Self {
15 Self::new_with_inner(
16 HashSet::from_iter(vec.iter().cloned())
17 )
18 }
19
20 /// Check if the set of delimiters contains a
21 /// particular delimiter character.
22 fn contains(&self, ch: char) -> bool {
23 self.inner().contains(&ch)
24 }
25}
26
27/// Set of all delimiter characters that will not
28/// become tokens through [Tokens::new](crate::lexer::Tokens::new).
29pub struct DiscardDelimiters(HashSet<char>);
30impl Inner for DiscardDelimiters {
31 fn new_with_inner(v: HashSet<char>) -> Self {
32 Self(v)
33 }
34 fn inner(&self) -> &HashSet<char> {
35 &self.0
36 }
37}
38impl Delimiters for DiscardDelimiters {}
39
40/// Set of all delimiter characters that will
41/// also become tokens through [Tokens::new](crate::lexer::Tokens::new).
42pub struct KeepDelimiters(HashSet<char>);
43impl Delimiters for KeepDelimiters {}
44impl Inner for KeepDelimiters {
45 fn new_with_inner(v: HashSet<char>) -> Self {
46 Self(v)
47 }
48 fn inner(&self) -> &HashSet<char> {
49 &self.0
50 }
51}
52
53/// Group the two delimiter sets.
54pub struct DelimitersParam {
55 /// The set of delimiters to keep.
56 pub keep: KeepDelimiters,
57 /// The set of delimiters to discard.
58 pub discard: DiscardDelimiters
59}