@@ -7,7 +7,7 @@ use std::slice::Iter;
77use std:: collections:: HashSet ;
88use std:: iter:: FromIterator ;
99
10- use error :: { Error , Result } ;
10+ use super :: { Error , Result } ;
1111
1212use interpreter:: Renderable ;
1313use interpreter:: Text ;
@@ -42,6 +42,18 @@ pub fn parse(elements: &[Element], options: &LiquidOptions) -> Result<Vec<Box<Re
4242 Ok ( ret)
4343}
4444
45+ const NOTHING : Option < & str > = None ;
46+
47+ pub fn unexpected_token_error < S : ToString > ( expected : & str , actual : Option < S > ) -> Error {
48+ let actual = actual. map ( |x| x. to_string ( ) ) ;
49+ unexpected_token_error_string ( expected, actual)
50+ }
51+
52+ pub fn unexpected_token_error_string ( expected : & str , actual : Option < String > ) -> Error {
53+ let actual = actual. unwrap_or_else ( || "nothing" . to_owned ( ) ) ;
54+ Error :: with_msg ( format ! ( "Expected {}, found `{}`" , expected, actual) )
55+ }
56+
4557// creates an expression, which wraps everything that gets rendered
4658fn parse_expression ( tokens : & [ Token ] , options : & LiquidOptions ) -> Result < Box < Renderable > > {
4759 match tokens. get ( 0 ) {
@@ -56,7 +68,7 @@ fn parse_expression(tokens: &[Token], options: &LiquidOptions) -> Result<Box<Ren
5668 Some ( & Token :: Identifier ( ref x) ) if options. tags . contains_key ( x. as_str ( ) ) => {
5769 options. tags [ x. as_str ( ) ] . parse ( x, & tokens[ 1 ..] , options)
5870 }
59- None => Error :: parser ( "expression" , None ) ,
71+ None => Err ( unexpected_token_error ( "expression" , NOTHING ) ) ,
6072 _ => {
6173 let output = parse_output ( tokens) ?;
6274 Ok ( Box :: new ( output) )
@@ -75,7 +87,7 @@ pub fn parse_indexes(mut tokens: &[Token]) -> Result<Vec<Index>> {
7587 match tokens[ 1 ] {
7688 Token :: Identifier ( ref x) => indexes. push ( Index :: with_key ( x. as_ref ( ) ) ) ,
7789 _ => {
78- return Error :: parser ( "identifier" , Some ( & tokens[ 0 ] ) ) ;
90+ return Err ( unexpected_token_error ( "identifier" , Some ( & tokens[ 0 ] ) ) ) ;
7991 }
8092 } ;
8193 2
@@ -85,13 +97,14 @@ pub fn parse_indexes(mut tokens: &[Token]) -> Result<Vec<Index>> {
8597 Token :: StringLiteral ( ref x) => Index :: with_key ( x. as_ref ( ) ) ,
8698 Token :: IntegerLiteral ( ref x) => Index :: with_index ( * x as isize ) ,
8799 _ => {
88- return Error :: parser ( "integer | string" , Some ( & tokens[ 0 ] ) ) ;
100+ return Err ( unexpected_token_error ( "string | whole number" ,
101+ Some ( & tokens[ 0 ] ) ) ) ;
89102 }
90103 } ;
91104 indexes. push ( index) ;
92105
93106 if tokens[ 2 ] != Token :: CloseSquare {
94- return Error :: parser ( "] ", Some ( & tokens[ 1 ] ) ) ;
107+ return Err ( unexpected_token_error ( "`]` ", Some ( & tokens[ 0 ] ) ) ) ;
95108 }
96109 3
97110 }
@@ -118,7 +131,7 @@ pub fn parse_output(tokens: &[Token]) -> Result<Output> {
118131 let name = match iter. next ( ) {
119132 Some ( & Token :: Identifier ( ref name) ) => name,
120133 x => {
121- return Error :: parser ( "an identifier", x) ;
134+ return Err ( unexpected_token_error ( " identifier", x) ) ;
122135 }
123136 } ;
124137 let mut args = vec ! [ ] ;
@@ -147,7 +160,7 @@ pub fn parse_output(tokens: &[Token]) -> Result<Output> {
147160 Some ( & & Token :: Pipe ) |
148161 None => break ,
149162 _ => {
150- return Error :: parser ( "a comma or a pipe ", Some ( iter. next ( ) . unwrap ( ) ) ) ;
163+ return Err ( unexpected_token_error ( "`,` | `|` ", Some ( iter. next ( ) . unwrap ( ) ) ) ) ;
151164 }
152165 }
153166 }
@@ -206,7 +219,7 @@ fn parse_tag(iter: &mut Iter<Element>,
206219 options. blocks [ x. as_str ( ) ] . parse ( x, & tokens[ 1 ..] , & children, options)
207220 }
208221
209- ref x => Err ( Error :: Parser ( format ! ( "parse_tag: {:?} not implemented" , x) ) ) ,
222+ ref x => Err ( Error :: with_msg ( "Tag is not supported" ) . context ( "tag" , x) ) ,
210223 }
211224}
212225
@@ -217,7 +230,7 @@ pub fn expect<'a, T>(tokens: &mut T, expected: &Token) -> Result<&'a Token>
217230{
218231 match tokens. next ( ) {
219232 Some ( x) if x == expected => Ok ( x) ,
220- x => Error :: parser ( & expected . to_string ( ) , x) ,
233+ x => Err ( unexpected_token_error ( & format ! ( "`{}`" , expected ) , x) ) ,
221234 }
222235}
223236
@@ -227,7 +240,7 @@ pub fn expect<'a, T>(tokens: &mut T, expected: &Token) -> Result<&'a Token>
227240pub fn consume_value_token ( tokens : & mut Iter < Token > ) -> Result < Token > {
228241 match tokens. next ( ) {
229242 Some ( t) => value_token ( t. clone ( ) ) ,
230- None => Error :: parser ( "string | number | boolean | identifier" , None ) ,
243+ None => Err ( unexpected_token_error ( "string | number | boolean | identifier" , NOTHING ) ) ,
231244 }
232245}
233246
@@ -240,7 +253,7 @@ pub fn value_token(t: Token) -> Result<Token> {
240253 v @ Token :: FloatLiteral ( _) |
241254 v @ Token :: BooleanLiteral ( _) |
242255 v @ Token :: Identifier ( _) => Ok ( v) ,
243- x => Error :: parser ( "string | number | boolean | identifier" , Some ( & x) ) ,
256+ x => Err ( unexpected_token_error ( "string | number | boolean | identifier" , Some ( & x) ) ) ,
244257 }
245258}
246259
@@ -323,7 +336,7 @@ mod test_parse_output {
323336
324337 let result = parse_output ( & tokens) ;
325338 assert_eq ! ( result. unwrap_err( ) . to_string( ) ,
326- "Parsing error : Expected an identifier, found 1 " ) ;
339+ "liquid : Expected identifier, found `1` \n " ) ;
327340 }
328341
329342 #[ test]
@@ -332,7 +345,7 @@ mod test_parse_output {
332345
333346 let result = parse_output ( & tokens) ;
334347 assert_eq ! ( result. unwrap_err( ) . to_string( ) ,
335- "Parsing error : Expected a comma or a pipe , found blabla" ) ;
348+ "liquid : Expected `,` | `|` , found ` blabla` \n " ) ;
336349 }
337350
338351 #[ test]
@@ -341,7 +354,7 @@ mod test_parse_output {
341354
342355 let result = parse_output ( & tokens) ;
343356 assert_eq ! ( result. unwrap_err( ) . to_string( ) ,
344- "Parsing error : Expected : , found 1 " ) ;
357+ "liquid : Expected `:` , found `1` \n " ) ;
345358 }
346359}
347360
0 commit comments