Feat v0.9.2 converter consolidation (#75)
All checks were successful
CI/CD / detect-changes (push) Successful in 4s
CI/CD / test-frontend (push) Has been skipped
CI/CD / test-runners (push) Has been skipped
CI/CD / e2e-smoke (push) Has been skipped
CI/CD / test-go-pg (push) Successful in 2m51s
CI/CD / test-sqlite (push) Successful in 3m1s
CI/CD / build-and-deploy (push) Successful in 1m17s

Co-authored-by: Jeffrey Smith <jasafpro@gmail.com>
Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
This commit was merged in pull request #75.
This commit is contained in:
2026-04-03 14:32:14 +00:00
committed by xcaliber
parent d03dfe502f
commit 983d761bbe
24 changed files with 362 additions and 479 deletions

View File

@@ -164,7 +164,7 @@ func filesGet(ctx context.Context, cfg FilesModuleConfig) func(*starlark.Thread,
metaRC.Close()
var m map[string]any
if json.Unmarshal(metaBytes, &m) == nil {
metaDict = mapToStarlarkDict(m)
metaDict = MapToDict(m)
}
}
@@ -207,7 +207,7 @@ func filesMeta(ctx context.Context, cfg FilesModuleConfig) func(*starlark.Thread
metaRC.Close()
var m map[string]any
if json.Unmarshal(metaBytes, &m) == nil {
metaDict = mapToStarlarkDict(m)
metaDict = MapToDict(m)
}
}
@@ -396,77 +396,13 @@ func filesMaxSize() int64 {
return filesDefaultMaxSize
}
// starlarkDictToMap converts a *starlark.Dict to map[string]any.
// starlarkDictToMap converts a *starlark.Dict to map[string]any, validating
// that all keys are strings. Returns an error if a non-string key is found.
func starlarkDictToMap(d *starlark.Dict) (map[string]any, error) {
m := make(map[string]any, d.Len())
for _, item := range d.Items() {
k, ok := starlark.AsString(item[0])
if !ok {
if _, ok := starlark.AsString(item[0]); !ok {
return nil, fmt.Errorf("metadata keys must be strings, got %s", item[0].Type())
}
m[k] = starlarkValueToGo(item[1])
}
return m, nil
}
// starlarkValueToGo converts a starlark.Value to a Go value for JSON serialization.
func starlarkValueToGo(v starlark.Value) any {
switch x := v.(type) {
case starlark.String:
return string(x)
case starlark.Int:
if i, ok := x.Int64(); ok {
return i
}
return x.String()
case starlark.Float:
return float64(x)
case starlark.Bool:
return bool(x)
case *starlark.List:
out := make([]any, x.Len())
for i := 0; i < x.Len(); i++ {
out[i] = starlarkValueToGo(x.Index(i))
}
return out
case *starlark.Dict:
m, _ := starlarkDictToMap(x)
return m
default:
return v.String()
}
}
// mapToStarlarkDict converts a map[string]any to *starlark.Dict.
func mapToStarlarkDict(m map[string]any) *starlark.Dict {
d := starlark.NewDict(len(m))
for k, v := range m {
d.SetKey(starlark.String(k), goValueToStarlark(v))
}
return d
}
// goValueToStarlark converts a Go value (from JSON) to starlark.Value.
func goValueToStarlark(v any) starlark.Value {
switch x := v.(type) {
case string:
return starlark.String(x)
case float64:
if x == float64(int64(x)) {
return starlark.MakeInt64(int64(x))
}
return starlark.Float(x)
case bool:
return starlark.Bool(x)
case []any:
elems := make([]starlark.Value, len(x))
for i, e := range x {
elems[i] = goValueToStarlark(e)
}
return starlark.NewList(elems)
case map[string]any:
return mapToStarlarkDict(x)
default:
return starlark.None
}
return DictToMap(d), nil
}