@@ -24,20 +24,28 @@ pub(crate) struct MetaTemplate(pub(crate) Vec<Op>);
24
24
25
25
impl MetaTemplate {
26
26
pub ( crate ) fn parse_pattern ( pattern : & tt:: Subtree ) -> Result < MetaTemplate , ParseError > {
27
- let ops =
28
- parse_inner ( pattern, Mode :: Pattern ) . into_iter ( ) . collect :: < Result < _ , ParseError > > ( ) ?;
29
- Ok ( MetaTemplate ( ops) )
27
+ MetaTemplate :: parse ( pattern, Mode :: Pattern )
30
28
}
31
29
32
30
pub ( crate ) fn parse_template ( template : & tt:: Subtree ) -> Result < MetaTemplate , ParseError > {
33
- let ops =
34
- parse_inner ( template, Mode :: Template ) . into_iter ( ) . collect :: < Result < _ , ParseError > > ( ) ?;
35
- Ok ( MetaTemplate ( ops) )
31
+ MetaTemplate :: parse ( template, Mode :: Template )
36
32
}
37
33
38
34
pub ( crate ) fn iter ( & self ) -> impl Iterator < Item = & Op > {
39
35
self . 0 . iter ( )
40
36
}
37
+
38
+ fn parse ( tt : & tt:: Subtree , mode : Mode ) -> Result < MetaTemplate , ParseError > {
39
+ let mut src = TtIter :: new ( tt) ;
40
+
41
+ let mut res = Vec :: new ( ) ;
42
+ while let Some ( first) = src. next ( ) {
43
+ let op = next_op ( first, & mut src, mode) ?;
44
+ res. push ( op)
45
+ }
46
+
47
+ Ok ( MetaTemplate ( res) )
48
+ }
41
49
}
42
50
43
51
#[ derive( Clone , Debug , PartialEq , Eq ) ]
@@ -96,15 +104,6 @@ enum Mode {
96
104
Template ,
97
105
}
98
106
99
- fn parse_inner ( tt : & tt:: Subtree , mode : Mode ) -> Vec < Result < Op , ParseError > > {
100
- let mut src = TtIter :: new ( tt) ;
101
- std:: iter:: from_fn ( move || {
102
- let first = src. next ( ) ?;
103
- Some ( next_op ( first, & mut src, mode) )
104
- } )
105
- . collect ( )
106
- }
107
-
108
107
macro_rules! err {
109
108
( $( $tt: tt) * ) => {
110
109
ParseError :: UnexpectedToken ( ( $( $tt) * ) . to_string( ) )
@@ -128,10 +127,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
128
127
match second {
129
128
tt:: TokenTree :: Subtree ( subtree) => {
130
129
let ( separator, kind) = parse_repeat ( src) ?;
131
- let tokens = parse_inner ( subtree, mode)
132
- . into_iter ( )
133
- . collect :: < Result < Vec < Op > , ParseError > > ( ) ?;
134
- Op :: Repeat { tokens : MetaTemplate ( tokens) , separator, kind }
130
+ let tokens = MetaTemplate :: parse ( subtree, mode) ?;
131
+ Op :: Repeat { tokens, separator, kind }
135
132
}
136
133
tt:: TokenTree :: Leaf ( leaf) => match leaf {
137
134
tt:: Leaf :: Punct ( _) => {
@@ -162,9 +159,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
162
159
}
163
160
tt:: TokenTree :: Leaf ( tt) => Op :: Leaf ( tt. clone ( ) ) ,
164
161
tt:: TokenTree :: Subtree ( subtree) => {
165
- let tokens =
166
- parse_inner ( subtree, mode) . into_iter ( ) . collect :: < Result < Vec < Op > , ParseError > > ( ) ?;
167
- Op :: Subtree { tokens : MetaTemplate ( tokens) , delimiter : subtree. delimiter }
162
+ let tokens = MetaTemplate :: parse ( subtree, mode) ?;
163
+ Op :: Subtree { tokens, delimiter : subtree. delimiter }
168
164
}
169
165
} ;
170
166
Ok ( res)
0 commit comments