@@ -24,20 +24,28 @@ pub(crate) struct MetaTemplate(pub(crate) Vec<Op>);
2424
2525impl MetaTemplate {
2626 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 )
3028 }
3129
3230 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 )
3632 }
3733
3834 pub ( crate ) fn iter ( & self ) -> impl Iterator < Item = & Op > {
3935 self . 0 . iter ( )
4036 }
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+ }
4149}
4250
4351#[ derive( Clone , Debug , PartialEq , Eq ) ]
@@ -96,15 +104,6 @@ enum Mode {
96104 Template ,
97105}
98106
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-
108107macro_rules! err {
109108 ( $( $tt: tt) * ) => {
110109 ParseError :: UnexpectedToken ( ( $( $tt) * ) . to_string( ) )
@@ -128,10 +127,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
128127 match second {
129128 tt:: TokenTree :: Subtree ( subtree) => {
130129 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 }
135132 }
136133 tt:: TokenTree :: Leaf ( leaf) => match leaf {
137134 tt:: Leaf :: Punct ( _) => {
@@ -162,9 +159,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
162159 }
163160 tt:: TokenTree :: Leaf ( tt) => Op :: Leaf ( tt. clone ( ) ) ,
164161 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 }
168164 }
169165 } ;
170166 Ok ( res)
0 commit comments