Support iterator functions and range-over-int
This commit is contained in:
parent
6d260619b7
commit
bcb8222ebf
@ -99,7 +99,7 @@ In this example:
|
||||
|
||||
### `for` tag
|
||||
|
||||
Salix's `for` tag is used for iterating over slices, arrays, and maps. It can assign one or two variables depending on your needs. When using a single variable, it sets that variable to the current element in the case of slices or arrays, or the current value for maps. With two variables, it assigns the first to the index (in the case of slices or arrays) or the key (for maps), and the second to the element or value, respectively. Here's an example of the for tag in action:
|
||||
Salix's `for` tag is used for iterating over iterable variables, such as slices, maps, iterator functions, etc. It can assign one or two variables depending on your needs. When using a single variable, it sets that variable to the current element in the case of slices or arrays, or the current value for maps. With two variables, it assigns the first to the index (in the case of slices or arrays) or the key (for maps), and the second to the element or value, respectively. Here's an example of the for tag in action:
|
||||
|
||||
```
|
||||
#for(id, name in users):
|
||||
|
41
for_tag.go
41
for_tag.go
@ -55,6 +55,15 @@ func (ft forTag) Run(tc *TagContext, block, args []ast.Node) error {
|
||||
in = reflect.ValueOf(val)
|
||||
|
||||
switch in.Kind() {
|
||||
case reflect.Int:
|
||||
local := map[string]any{}
|
||||
for i := range in.Int() {
|
||||
local[vars[0]] = i
|
||||
err = tc.Execute(block, local)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
case reflect.Slice, reflect.Array:
|
||||
local := map[string]any{}
|
||||
for i := 0; i < in.Len(); i++ {
|
||||
@ -95,6 +104,38 @@ func (ft forTag) Run(tc *TagContext, block, args []ast.Node) error {
|
||||
|
||||
i++
|
||||
}
|
||||
case reflect.Func:
|
||||
local := map[string]any{}
|
||||
i := 0
|
||||
if len(vars) == 1 {
|
||||
for val := range in.Seq() {
|
||||
local[vars[0]] = val.Interface()
|
||||
err = tc.Execute(block, local)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else if len(vars) == 2 {
|
||||
for val1, val2 := range in.Seq2() {
|
||||
local[vars[0]] = val1.Interface()
|
||||
local[vars[1]] = val2.Interface()
|
||||
err = tc.Execute(block, local)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for val1, val2 := range in.Seq2() {
|
||||
local[vars[0]] = i
|
||||
local[vars[1]] = val1.Interface()
|
||||
local[vars[2]] = val2.Interface()
|
||||
err = tc.Execute(block, local)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
i++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
|
Loading…
x
Reference in New Issue
Block a user