@@ -143,7 +143,8 @@ fn validate_argument_order(
143143 }
144144
145145 match arg {
146- TagArg :: Literal { lit, required } => {
146+ TagArg :: Literal { lit, required, .. } => {
147+ // kind field is ignored for validation - it's only for semantic hints
147148 let matches_literal = bits[ bit_index] == lit. as_ref ( ) ;
148149 if * required {
149150 if matches_literal {
@@ -234,6 +235,11 @@ fn validate_argument_order(
234235 if token. contains ( '=' ) {
235236 break ;
236237 }
238+ crate :: templatetags:: TokenCount :: Greedy => {
239+ // Assignment arguments can appear as:
240+ // 1. Single token: var=value
241+ // 2. Multi-token: expr as varname
242+ // Consume until we find = or "as", or hit next literal
237243
238244 // If we hit "as", consume the variable name after it
239245 if token == "as" && bit_index < bits. len ( ) {
@@ -403,16 +409,13 @@ mod tests {
403409 fn test_if_tag_with_comparison_operator ( ) {
404410 // Issue #1: {% if message.input_tokens > 0 %}
405411 // Parser tokenizes as: ["message.input_tokens", ">", "0"]
406- // Spec expects: [Expr {name="condition"}]
412+ // Spec expects: [Any {name="condition", count=Greedy }]
407413 let bits = vec ! [
408414 "message.input_tokens" . to_string( ) ,
409415 ">" . to_string( ) ,
410416 "0" . to_string( ) ,
411417 ] ;
412- let args = vec ! [ TagArg :: Expr {
413- name: "condition" . into( ) ,
414- required: true ,
415- } ] ;
418+ let args = vec ! [ TagArg :: expr( "condition" , true ) ] ;
416419
417420 let errors = check_validation_errors ( "if" , & bits, & args) ;
418421 assert ! (
@@ -448,22 +451,10 @@ mod tests {
448451 "reversed" . to_string( ) ,
449452 ] ;
450453 let args = vec ! [
451- TagArg :: Var {
452- name: "item" . into( ) ,
453- required: true ,
454- } ,
455- TagArg :: Literal {
456- lit: "in" . into( ) ,
457- required: true ,
458- } ,
459- TagArg :: Var {
460- name: "items" . into( ) ,
461- required: true ,
462- } ,
463- TagArg :: Literal {
464- lit: "reversed" . into( ) ,
465- required: false ,
466- } ,
454+ TagArg :: var( "item" , true ) ,
455+ TagArg :: syntax( "in" , true ) ,
456+ TagArg :: var( "items" , true ) ,
457+ TagArg :: modifier( "reversed" , false ) ,
467458 ] ;
468459
469460 let errors = check_validation_errors ( "for" , & bits, & args) ;
@@ -481,10 +472,7 @@ mod tests {
481472 "and" . to_string( ) ,
482473 "user.is_staff" . to_string( ) ,
483474 ] ;
484- let args = vec ! [ TagArg :: Expr {
485- name: "condition" . into( ) ,
486- required: true ,
487- } ] ;
475+ let args = vec ! [ TagArg :: expr( "condition" , true ) ] ;
488476
489477 let errors = check_validation_errors ( "if" , & bits, & args) ;
490478 assert ! (
@@ -521,10 +509,7 @@ mod tests {
521509 fn test_with_assignment ( ) {
522510 // {% with total=items|length %}
523511 let bits = vec ! [ "total=items|length" . to_string( ) ] ;
524- let args = vec ! [ TagArg :: Assignment {
525- name: "bindings" . into( ) ,
526- required: true ,
527- } ] ;
512+ let args = vec ! [ TagArg :: assignment( "bindings" , true ) ] ;
528513
529514 let errors = check_validation_errors ( "with" , & bits, & args) ;
530515 assert ! (
@@ -556,14 +541,8 @@ mod tests {
556541 "reversed" . to_string( ) ,
557542 ] ;
558543 let args = vec ! [
559- TagArg :: Expr {
560- name: "condition" . into( ) ,
561- required: true ,
562- } ,
563- TagArg :: Literal {
564- lit: "reversed" . into( ) ,
565- required: false ,
566- } ,
544+ TagArg :: expr( "condition" , true ) ,
545+ TagArg :: modifier( "reversed" , false ) ,
567546 ] ;
568547
569548 let errors = check_validation_errors ( "if" , & bits, & args) ;
@@ -675,18 +654,9 @@ mod tests {
675654 "library" . to_string( ) ,
676655 ] ;
677656 let args = vec ! [
678- TagArg :: VarArgs {
679- name: "tags" . into( ) ,
680- required: false ,
681- } ,
682- TagArg :: Literal {
683- lit: "from" . into( ) ,
684- required: false ,
685- } ,
686- TagArg :: Var {
687- name: "library" . into( ) ,
688- required: false ,
689- } ,
657+ TagArg :: varargs( "tags" , false ) ,
658+ TagArg :: syntax( "from" , false ) ,
659+ TagArg :: var( "library" , false ) ,
690660 ] ;
691661
692662 let errors = check_validation_errors ( "load" , & bits, & args) ;
0 commit comments