diff --git a/internal/appconfig/serde.go b/internal/appconfig/serde.go index f429986300..be9a473cc3 100644 --- a/internal/appconfig/serde.go +++ b/internal/appconfig/serde.go @@ -290,7 +290,7 @@ func stringifyYAMLMapKeys(obj any) any { } else if mapobj, ok := obj.(map[any]any); ok { newmap := make(map[string]any) for k, v := range mapobj { - newmap[k.(string)] = stringifyYAMLMapKeys(v) + newmap[fmt.Sprint(k)] = stringifyYAMLMapKeys(v) } obj = newmap } diff --git a/internal/appconfig/serde_test.go b/internal/appconfig/serde_test.go index 8645e72ef4..47f61990d0 100644 --- a/internal/appconfig/serde_test.go +++ b/internal/appconfig/serde_test.go @@ -780,6 +780,25 @@ func TestYAMLPrettyPrint(t *testing.T) { assert.Contains(t, string(buf), "\n processes:\n - web\n") } +func TestLoadYAMLAppConfigWithNonStringKeys(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "fly.yaml") + err := os.WriteFile(path, []byte("app: foo\nenv:\n 1: one\n true: yes\n"), 0o600) + require.NoError(t, err) + + require.NotPanics(t, func() { + cfg, err := LoadConfig(path) + assert.NoError(t, err) + assert.Equal(t, "foo", cfg.AppName) + assert.Equal(t, "one", cfg.Env["1"]) + assert.Equal(t, "yes", cfg.Env["true"]) + + cfgMap, err := LoadConfigAsMap(path) + assert.NoError(t, err) + assert.Equal(t, "foo", cfgMap["app"]) + }) +} + //go:fix inline func UintPointer(v uint32) *uint32 { return new(v)