9
9
"strings"
10
10
"time"
11
11
12
+ "github.com/expr-lang/expr/internal/deref"
12
13
"github.com/expr-lang/expr/vm/runtime"
13
14
)
14
15
@@ -440,7 +441,7 @@ var Builtins = []*Function{
440
441
sum := int64 (0 )
441
442
i := 0
442
443
for ; i < v .Len (); i ++ {
443
- it := deref (v .Index (i ))
444
+ it := deref . Value (v .Index (i ))
444
445
if it .CanInt () {
445
446
sum += it .Int ()
446
447
} else if it .CanFloat () {
@@ -453,7 +454,7 @@ var Builtins = []*Function{
453
454
float:
454
455
fSum := float64 (sum )
455
456
for ; i < v .Len (); i ++ {
456
- it := deref (v .Index (i ))
457
+ it := deref . Value (v .Index (i ))
457
458
if it .CanInt () {
458
459
fSum += float64 (it .Int ())
459
460
} else if it .CanFloat () {
@@ -492,7 +493,7 @@ var Builtins = []*Function{
492
493
sum := float64 (0 )
493
494
i := 0
494
495
for ; i < v .Len (); i ++ {
495
- it := deref (v .Index (i ))
496
+ it := deref . Value (v .Index (i ))
496
497
if it .CanInt () {
497
498
sum += float64 (it .Int ())
498
499
} else if it .CanFloat () {
@@ -530,7 +531,7 @@ var Builtins = []*Function{
530
531
}
531
532
s := make ([]float64 , v .Len ())
532
533
for i := 0 ; i < v .Len (); i ++ {
533
- it := deref (v .Index (i ))
534
+ it := deref . Value (v .Index (i ))
534
535
if it .CanInt () {
535
536
s [i ] = float64 (it .Int ())
536
537
} else if it .CanFloat () {
@@ -850,7 +851,7 @@ var Builtins = []*Function{
850
851
}
851
852
out := reflect .MakeMap (mapType )
852
853
for i := 0 ; i < v .Len (); i ++ {
853
- pair := deref (v .Index (i ))
854
+ pair := deref . Value (v .Index (i ))
854
855
if pair .Kind () != reflect .Array && pair .Kind () != reflect .Slice {
855
856
return nil , fmt .Errorf ("invalid pair %v" , pair )
856
857
}
@@ -908,6 +909,49 @@ var Builtins = []*Function{
908
909
}
909
910
},
910
911
},
912
+ {
913
+ Name : "concat" ,
914
+ Safe : func (args ... any ) (any , uint , error ) {
915
+ if len (args ) == 0 {
916
+ return nil , 0 , fmt .Errorf ("invalid number of arguments (expected at least 1, got 0)" )
917
+ }
918
+
919
+ var size uint
920
+ var arr []any
921
+
922
+ for _ , arg := range args {
923
+ v := reflect .ValueOf (deref .Deref (arg ))
924
+
925
+ if v .Kind () != reflect .Slice && v .Kind () != reflect .Array {
926
+ return nil , 0 , fmt .Errorf ("cannot concat %s" , v .Kind ())
927
+ }
928
+
929
+ size += uint (v .Len ())
930
+
931
+ for i := 0 ; i < v .Len (); i ++ {
932
+ item := v .Index (i )
933
+ arr = append (arr , item .Interface ())
934
+ }
935
+ }
936
+
937
+ return arr , size , nil
938
+ },
939
+ Validate : func (args []reflect.Type ) (reflect.Type , error ) {
940
+ if len (args ) == 0 {
941
+ return anyType , fmt .Errorf ("invalid number of arguments (expected at least 1, got 0)" )
942
+ }
943
+
944
+ for _ , arg := range args {
945
+ switch kind (deref .Type (arg )) {
946
+ case reflect .Interface , reflect .Slice , reflect .Array :
947
+ default :
948
+ return anyType , fmt .Errorf ("cannot concat %s" , arg )
949
+ }
950
+ }
951
+
952
+ return arrayType , nil
953
+ },
954
+ },
911
955
{
912
956
Name : "sort" ,
913
957
Safe : func (args ... any ) (any , uint , error ) {
0 commit comments