From 48c5ebbd2be8f7d89f37f3aa04500b8ad1a3d460 Mon Sep 17 00:00:00 2001 From: mcarton Date: Wed, 12 Dec 2018 20:43:36 +0100 Subject: Allow using brackets for enums in `match` --- askama_derive/src/parser.rs | 54 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 4 deletions(-) (limited to 'askama_derive/src/parser.rs') diff --git a/askama_derive/src/parser.rs b/askama_derive/src/parser.rs index e1a7fc0..7968ac1 100644 --- a/askama_derive/src/parser.rs +++ b/askama_derive/src/parser.rs @@ -77,10 +77,22 @@ pub type Cond<'a> = (WS, Option>, Vec>); pub type When<'a> = ( WS, Option>, - Vec>, + MatchParameters<'a>, Vec>, ); +#[derive(Debug)] +pub enum MatchParameters<'a> { + Simple(Vec>), + Named(Vec<(&'a str, Option>)>), +} + +impl<'a> Default for MatchParameters<'a> { + fn default() -> Self { + MatchParameters::Simple(vec![]) + } +} + type Input<'a> = nom::types::CompleteByteSlice<'a>; #[allow(non_snake_case)] fn Input(input: &[u8]) -> Input { @@ -309,8 +321,13 @@ named!(parameters>, do_parse!( (vals.unwrap_or_default()) )); -named!(with_parameters>, do_parse!( +named!(with_parameters, do_parse!( tag!("with") >> + value: alt!(match_simple_parameters | match_named_parameters) >> + (value) +)); + +named!(match_simple_parameters, do_parse!( ws!(tag!("(")) >> vals: opt!(do_parse!( arg0: ws!(match_parameter) >> @@ -326,7 +343,26 @@ named!(with_parameters>, do_parse!( }) )) >> tag!(")") >> - (vals.unwrap_or_default()) + (MatchParameters::Simple(vals.unwrap_or_default())) +)); + +named!(match_named_parameters, do_parse!( + ws!(tag!("{")) >> + vals: opt!(do_parse!( + arg0: ws!(match_named_parameter) >> + args: many0!(do_parse!( + tag!(",") >> + argn: ws!(match_named_parameter) >> + (argn) + )) >> + ({ + let mut res = vec![arg0]; + res.extend(args); + res + }) + )) >> + tag!("}") >> + (MatchParameters::Named(vals.unwrap_or_default())) )); named!(expr_group, map!( @@ -356,6 +392,16 @@ named!(match_parameter, alt!( param_str_lit )); +named!(match_named_parameter)>, do_parse!( + name: identifier >> + param: opt!(do_parse!( + ws!(tag!(":")) >> + param: match_parameter >> + (param) + )) >> + ((name, param)) +)); + named!(attr>)>, do_parse!( tag!(".") >> attr: alt!(num_lit | identifier) >> @@ -549,7 +595,7 @@ named_args!(match_else_block<'a>(s: &'a Syntax<'a>) , When<'a>>, do_pa nws: opt!(tag!("-")) >> call!(tag_block_end, s) >> block: call!(parse_template, s) >> - (WS(pws.is_some(), nws.is_some()), None, vec![], block) + (WS(pws.is_some(), nws.is_some()), None, MatchParameters::Simple(vec![]), block) )); named_args!(when_block<'a>(s: &'a Syntax<'a>) , When<'a>>, do_parse!( -- cgit