@@ -163,7 +163,8 @@ fn validate_choices_and_order(
163163 args_consumed = arg_index + 1 ;
164164
165165 match arg {
166- TagArg :: Literal { lit, required } => {
166+ TagArg :: Literal { lit, required, .. } => {
167+ // kind field is ignored for validation - it's only for semantic hints
167168 let matches_literal = bits[ bit_index] == lit. as_ref ( ) ;
168169 if * required {
169170 if matches_literal {
@@ -257,6 +258,11 @@ fn validate_choices_and_order(
257258 if token. contains ( '=' ) {
258259 break ;
259260 }
261+ crate :: templatetags:: TokenCount :: Greedy => {
262+ // Assignment arguments can appear as:
263+ // 1. Single token: var=value
264+ // 2. Multi-token: expr as varname
265+ // Consume until we find = or "as", or hit next literal
260266
261267 // If we hit "as", consume one more token (the variable name)
262268 if token == "as" {
@@ -449,16 +455,13 @@ mod tests {
449455 fn test_if_tag_with_comparison_operator ( ) {
450456 // Issue #1: {% if message.input_tokens > 0 %}
451457 // Parser tokenizes as: ["message.input_tokens", ">", "0"]
452- // Spec expects: [Expr {name="condition"}]
458+ // Spec expects: [Any {name="condition", count=Greedy }]
453459 let bits = vec ! [
454460 "message.input_tokens" . to_string( ) ,
455461 ">" . to_string( ) ,
456462 "0" . to_string( ) ,
457463 ] ;
458- let args = vec ! [ TagArg :: Expr {
459- name: "condition" . into( ) ,
460- required: true ,
461- } ] ;
464+ let args = vec ! [ TagArg :: expr( "condition" , true ) ] ;
462465
463466 let errors = check_validation_errors ( "if" , & bits, & args) ;
464467 assert ! (
@@ -494,22 +497,10 @@ mod tests {
494497 "reversed" . to_string( ) ,
495498 ] ;
496499 let args = vec ! [
497- TagArg :: Var {
498- name: "item" . into( ) ,
499- required: true ,
500- } ,
501- TagArg :: Literal {
502- lit: "in" . into( ) ,
503- required: true ,
504- } ,
505- TagArg :: Var {
506- name: "items" . into( ) ,
507- required: true ,
508- } ,
509- TagArg :: Literal {
510- lit: "reversed" . into( ) ,
511- required: false ,
512- } ,
500+ TagArg :: var( "item" , true ) ,
501+ TagArg :: syntax( "in" , true ) ,
502+ TagArg :: var( "items" , true ) ,
503+ TagArg :: modifier( "reversed" , false ) ,
513504 ] ;
514505
515506 let errors = check_validation_errors ( "for" , & bits, & args) ;
@@ -527,10 +518,7 @@ mod tests {
527518 "and" . to_string( ) ,
528519 "user.is_staff" . to_string( ) ,
529520 ] ;
530- let args = vec ! [ TagArg :: Expr {
531- name: "condition" . into( ) ,
532- required: true ,
533- } ] ;
521+ let args = vec ! [ TagArg :: expr( "condition" , true ) ] ;
534522
535523 let errors = check_validation_errors ( "if" , & bits, & args) ;
536524 assert ! (
@@ -567,10 +555,7 @@ mod tests {
567555 fn test_with_assignment ( ) {
568556 // {% with total=items|length %}
569557 let bits = vec ! [ "total=items|length" . to_string( ) ] ;
570- let args = vec ! [ TagArg :: Assignment {
571- name: "bindings" . into( ) ,
572- required: true ,
573- } ] ;
558+ let args = vec ! [ TagArg :: assignment( "bindings" , true ) ] ;
574559
575560 let errors = check_validation_errors ( "with" , & bits, & args) ;
576561 assert ! (
@@ -602,14 +587,8 @@ mod tests {
602587 "reversed" . to_string( ) ,
603588 ] ;
604589 let args = vec ! [
605- TagArg :: Expr {
606- name: "condition" . into( ) ,
607- required: true ,
608- } ,
609- TagArg :: Literal {
610- lit: "reversed" . into( ) ,
611- required: false ,
612- } ,
590+ TagArg :: expr( "condition" , true ) ,
591+ TagArg :: modifier( "reversed" , false ) ,
613592 ] ;
614593
615594 let errors = check_validation_errors ( "if" , & bits, & args) ;
@@ -769,18 +748,9 @@ mod tests {
769748 "library" . to_string( ) ,
770749 ] ;
771750 let args = vec ! [
772- TagArg :: VarArgs {
773- name: "tags" . into( ) ,
774- required: false ,
775- } ,
776- TagArg :: Literal {
777- lit: "from" . into( ) ,
778- required: false ,
779- } ,
780- TagArg :: Var {
781- name: "library" . into( ) ,
782- required: false ,
783- } ,
751+ TagArg :: varargs( "tags" , false ) ,
752+ TagArg :: syntax( "from" , false ) ,
753+ TagArg :: var( "library" , false ) ,
784754 ] ;
785755
786756 let errors = check_validation_errors ( "load" , & bits, & args) ;
0 commit comments