1
+ use chumsky:: container:: OrderedSeq ;
2
+ use chumsky:: extra:: ParserExtra ;
1
3
pub use chumsky:: prelude:: Parser ;
2
4
use chumsky:: prelude:: * ;
5
+ use chumsky:: primitive:: Just ;
6
+ use chumsky:: text:: { Char , Padded } ;
3
7
4
8
#[ derive( Eq , PartialEq , Debug , Clone ) ]
5
9
pub enum Expr < ' src > {
@@ -18,13 +22,16 @@ pub enum UseExpr<'src> {
18
22
Glob ,
19
23
}
20
24
21
- pub fn parser < ' src > ( )
22
- -> impl Parser < ' src , & ' src str , Vec < Expr < ' src > > , extra:: Err < Rich < ' src , char > > > {
25
+ pub fn parser < ' src > ( ) -> impl Parser <
26
+ ' src ,
27
+ & ' src str ,
28
+ Vec < Expr < ' src > > ,
29
+ extra:: Err < Rich < ' src , char > > ,
30
+ > {
23
31
let use_expr = || {
24
- just ( "use" )
25
- . padded ( )
32
+ lexeme ( "use" )
26
33
. ignore_then ( use_parser ( ) )
27
- . then_ignore ( just ( ";" ) . padded ( ) . or_not ( ) )
34
+ . then_ignore ( lexeme ( ";" ) . or_not ( ) )
28
35
. map ( Expr :: Use )
29
36
} ;
30
37
@@ -39,28 +46,50 @@ pub fn parser<'src>()
39
46
use_expr ( ) . or ( other) . repeated ( ) . collect :: < Vec < _ > > ( )
40
47
}
41
48
42
- fn use_parser < ' src > ( )
43
- -> impl Parser < ' src , & ' src str , UseExpr < ' src > , extra:: Err < Rich < ' src , char > > > {
49
+ fn use_parser < ' src > ( ) -> impl Parser <
50
+ ' src ,
51
+ & ' src str ,
52
+ UseExpr < ' src > ,
53
+ extra:: Err < Rich < ' src , char > > ,
54
+ > {
44
55
recursive ( |use_parser| {
45
56
let ident = || text:: ascii:: ident ( ) . padded ( ) ;
46
57
let path = ident ( )
47
- . then ( just ( "as" ) . padded ( ) . ignore_then ( ident ( ) ) . or_not ( ) )
48
- . then ( just ( "::" ) . padded ( ) . ignore_then ( use_parser. clone ( ) ) . or_not ( ) )
49
- . map ( |( ( ident, rename) , nested) | UseExpr :: Path {
50
- ident,
51
- rename,
52
- nested : nested. map ( Box :: new) ,
58
+ . then (
59
+ lexeme ( "as" ) . ignore_then ( ident ( ) ) . or_not ( ) ,
60
+ )
61
+ . then (
62
+ lexeme ( "::" )
63
+ . ignore_then ( use_parser. clone ( ) )
64
+ . or_not ( ) ,
65
+ )
66
+ . map ( |( ( ident, rename) , nested) | {
67
+ UseExpr :: Path {
68
+ ident,
69
+ rename,
70
+ nested : nested. map ( Box :: new) ,
71
+ }
53
72
} ) ;
54
73
55
74
let group = use_parser
56
- . separated_by ( just ( ',' ) )
75
+ . separated_by ( lexeme ( ',' ) )
57
76
. allow_trailing ( )
58
77
. collect :: < Vec < _ > > ( )
59
- . delimited_by ( just ( '{' ) . padded ( ) , just ( '}' ) . padded ( ) )
78
+ . delimited_by ( lexeme ( '{' ) , lexeme ( '}' ) )
60
79
. map ( UseExpr :: Group ) ;
61
80
62
- let glob = just ( "*" ) . padded ( ) . map ( |_| UseExpr :: Glob ) ;
81
+ let glob = lexeme ( "*" ) . map ( |_| UseExpr :: Glob ) ;
63
82
64
83
path. or ( group) . or ( glob)
65
84
} )
66
85
}
86
+
87
+ fn lexeme < ' src , T , I , E > ( seq : T ) -> Padded < Just < T , I , E > >
88
+ where
89
+ I : Input < ' src > ,
90
+ I :: Token : Char ,
91
+ E : ParserExtra < ' src , I > ,
92
+ T : OrderedSeq < ' src , I :: Token > + Clone ,
93
+ {
94
+ just ( seq) . padded ( )
95
+ }
0 commit comments