package stdlib
import (
"encoding/json"
"os"
"github.com/grafana/agent/pkg/river/internal/value"
"github.com/grafana/agent/pkg/river/rivertypes"
)
var Identifiers = map[string]interface{}{
"constants": constants,
"env": os.Getenv,
"nonsensitive": func(secret rivertypes.Secret) string {
return string(secret)
},
"concat": value.RawFunction(func(funcValue value.Value, args ...value.Value) (value.Value, error) {
if len(args) == 0 {
return value.Array(), nil
}
var finalSize int
for i, arg := range args {
if arg.Type() != value.TypeArray {
return value.Null, value.ArgError{
Function: funcValue,
Argument: arg,
Index: i,
Inner: value.TypeError{
Value: arg,
Expected: value.TypeArray,
},
}
}
finalSize += arg.Len()
}
if len(args) == 1 {
return args[0], nil
}
raw := make([]value.Value, 0, finalSize)
for _, arg := range args {
for i := 0; i < arg.Len(); i++ {
raw = append(raw, arg.Index(i))
}
}
return value.Array(raw...), nil
}),
"json_decode": func(in string) (interface{}, error) {
var res interface{}
err := json.Unmarshal([]byte(in), &res)
if err != nil {
return nil, err
}
return res, nil
},
"coalesce": value.RawFunction(func(funcValue value.Value, args ...value.Value) (value.Value, error) {
if len(args) == 0 {
return value.Null, nil
}
for _, arg := range args {
if arg.Type() == value.TypeNull {
continue
}
if !arg.Reflect().IsZero() {
if argType := value.RiverType(arg.Reflect().Type()); (argType == value.TypeArray || argType == value.TypeObject) && arg.Len() == 0 {
continue
}
return arg, nil
}
}
return args[len(args)-1], nil
}),
}