Skip to content

Instantly share code, notes, and snippets.

@hungtcs
Created April 11, 2024 08:27
Show Gist options
  • Save hungtcs/33e0d3e270cea1b93f7a077fb19ef515 to your computer and use it in GitHub Desktop.
Save hungtcs/33e0d3e270cea1b93f7a077fb19ef515 to your computer and use it in GitHub Desktop.
starlark format function like js string interpolation
var predeclared = starlark.StringDict{
"format": starlark.NewBuiltin("format", func(thread *starlark.Thread, fn *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
var function = thread.DebugFrame(1).Callable().(*starlark.Function)
var locals = function.Locals()
var globals = function.Globals()
var formatArgs = make(map[string]starlark.Value)
for key, val := range globals {
formatArgs[key] = val
}
for idx, local := range locals {
formatArgs[local.Name] = thread.DebugFrame(1).Local(idx)
}
var string = args[0].(starlark.String)
var format *starlark.Builtin
if val, err := string.Attr("format"); err != nil {
return nil, err
} else {
format = val.(*starlark.Builtin)
}
var formatKwargs = make([]starlark.Tuple, 0)
for key, val := range formatArgs {
formatKwargs = append(formatKwargs, starlark.Tuple{starlark.String(key), val})
}
return starlark.Call(thread, format, starlark.Tuple{}, formatKwargs)
}),
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment