You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
See https://doc.rust-lang.org/reference/expressions/match-expr.html for the Rust syntax in the Reference Manual. Note that a match arm can have multiple targets; the object of this feature request is to replicate this in Askama. (I am not requesting 'match arm guards' (if clauses)).
So given code like
enum Suit {Clubs, Diamonds, Hearts, Spades}
one could write a template like
The card is
{% match suit %}
{% when Suit::Clubs or Suit::Spades %}
black
{% when Suit::Diamonds or Suit::Hearts %}
red
{% endmatch %}
Alternatively, or could be replaced by | in the proposed design, but I think Askama prefers keywords to symbols.
Looking at the code, combinator/mod.rs(587)ff defines how match statements are stored in the parse structure and how the code is parsed into this structure, and line 232ff covers when arms. So the target field would need to be a vector of Targets, and the when() function would need to be able to parse the modified when syntax., and the parse() function for Match around 595 also would need changing.
The Match structure is used in generator.rs around 544ff to generate the Rust code. This currently calls visit_target at 1559ff to generate the actual target; this would need to be changed around 576 to a call for each target and to output intervening | tokens.
There is some code around heritage.rs(93). I'm not sure what it does, but it looks like it moves the match arms without change, so maybe it does not require any change.
Also, the documentation will need changing, of course. near template_syntax.md(417)ff.
The test could look something like the following (in testing/tests/matches.rs), with the template above in testing/templates/match-enum.html).
enum Suit {Clubs, Diamonds, Hearts, Spades}
#[derive(Template)]
#[template(path = "match-enum.html")]
struct MatchEnumTemplate {
item: Suit,
}
#[test]
fn test_match_enum() {
let s = MatchEnumTemplate { item: Suit::Clubs};
assert_eq!(s.render().unwrap(), "\nThe card is black\n");
let s = MatchEnumTemplate { item: Suit::Hearts};
assert_eq!(s.render().unwrap(), "\nThe card is red\n");
}
The text was updated successfully, but these errors were encountered:
This has previously been discussed at #711 (comment) but I would like to move it to its own issue as it can be implemented separately.
The request is to enhance Askana's syntax for the
match
block (see https://djc.github.io/askama/template_syntax.html#match) to handle multiple targets in the same 'arm'.See https://doc.rust-lang.org/reference/expressions/match-expr.html for the Rust syntax in the Reference Manual. Note that a match arm can have multiple targets; the object of this feature request is to replicate this in Askama. (I am not requesting 'match arm guards' (
if
clauses)).So given code like
one could write a template like
Alternatively,
or
could be replaced by|
in the proposed design, but I think Askama prefers keywords to symbols.Looking at the code,
combinator/mod.rs(587)
ff defines how match statements are stored in the parse structure and how the code is parsed into this structure, and line 232ff coverswhen
arms. So thetarget
field would need to be a vector ofTargets
, and thewhen()
function would need to be able to parse the modifiedwhen
syntax., and theparse()
function forMatch
around 595 also would need changing.The
Match
structure is used ingenerator.rs
around 544ff to generate the Rust code. This currently callsvisit_target
at 1559ff to generate the actual target; this would need to be changed around 576 to a call for each target and to output intervening|
tokens.There is some code around
heritage.rs(93)
. I'm not sure what it does, but it looks like it moves the match arms without change, so maybe it does not require any change.Also, the documentation will need changing, of course. near
template_syntax.md(417)
ff.The test could look something like the following (in
testing/tests/matches.rs)
, with the template above intesting/templates/match-enum.html
).The text was updated successfully, but these errors were encountered: