lang: interfaces: Add new helpers for dealing with args

This commit is contained in:
James Shubin
2025-07-17 01:47:17 -04:00
parent bdf5209f68
commit 8edb8e2a7b

View File

@@ -454,15 +454,28 @@ func StructToCallableArgs(st types.Value) ([]types.Value, error) {
} }
// CallableArgsToStruct transforms the list of args, call representation of the // CallableArgsToStruct transforms the list of args, call representation of the
// graph represenation into a standard single struct value. Note, this is not // graph representation into a standard single struct value. Note, this is not
// the exact reverse operation of StructToCallableArgs because the arg names are // the exact reverse operation of StructToCallableArgs because the arg names are
// lost when performing that operation. // lost when performing that operation.
func CallableArgsToStruct(args []types.Value) (types.Value, error) { func CallableArgsToStruct(args []types.Value) (types.Value, error) {
fn := func(i int) (string, error) {
return util.NumToAlpha(i), nil
}
return CallableArgsToStructNamed(args, fn)
}
// CallableArgsToStructNamed transforms the list of args, call representation of
// the graph representation into a standard single struct value. This takes an
// input function which can be used to pick the arg names.
func CallableArgsToStructNamed(args []types.Value, fn func(int) (string, error)) (types.Value, error) {
m := make(map[string]*types.Type, len(args)) m := make(map[string]*types.Type, len(args))
ord := []string{} ord := []string{}
v := make(map[string]types.Value, len(args)) v := make(map[string]types.Value, len(args))
for i, arg := range args { for i, arg := range args {
s := util.NumToAlpha(i) // invent an arg name s, err := fn(i) // util.NumToAlpha(i) // invent an arg name
if err != nil {
return nil, err
}
m[s] = arg.Type() m[s] = arg.Type()
ord = append(ord, s) ord = append(ord, s)
v[s] = arg v[s] = arg
@@ -485,3 +498,16 @@ func CallableArgsToStruct(args []types.Value) (types.Value, error) {
return st, nil return st, nil
} }
// CallableArgsToStructNamedOrd transforms the list of args, call representation
// of the graph representation into a standard single struct value. This takes a
// list (the "Ord" value typically) which can be used to pick the arg names.
func CallableArgsToStructNamedOrd(args []types.Value, ord []string) (types.Value, error) {
fn := func(i int) (string, error) {
if i < 0 || i >= len(ord) {
return "", fmt.Errorf("arg %d not in list, have: %d", i, len(ord))
}
return ord[i], nil
}
return CallableArgsToStructNamed(args, fn)
}