| 887 | } |
| 888 | |
| 889 | func decodePersistedModuleObjectValue(ctx context.Context, dag *dagql.Server, val persistedModuleObjectValue) (any, error) { |
| 890 | switch val.Kind { |
| 891 | case "", persistedModuleObjectValueKindNull: |
| 892 | return nil, nil |
| 893 | case persistedModuleObjectValueKindResultRef: |
| 894 | return loadPersistedResultByResultID(ctx, dag, val.ResultID, "module object value") |
| 895 | case persistedModuleObjectValueKindCallID: |
| 896 | return decodePersistedCallID(val.CallID) |
| 897 | case persistedModuleObjectValueKindScalar: |
| 898 | var decoded any |
| 899 | if len(val.ScalarJSON) == 0 { |
| 900 | return nil, nil |
| 901 | } |
| 902 | if err := json.Unmarshal(val.ScalarJSON, &decoded); err != nil { |
| 903 | return nil, err |
| 904 | } |
| 905 | return decoded, nil |
| 906 | case persistedModuleObjectValueKindArray: |
| 907 | items := make([]any, 0, len(val.Items)) |
| 908 | for i, item := range val.Items { |
| 909 | decoded, err := decodePersistedModuleObjectValue(ctx, dag, item) |
| 910 | if err != nil { |
| 911 | return nil, fmt.Errorf("item %d: %w", i, err) |
| 912 | } |
| 913 | items = append(items, decoded) |
| 914 | } |
| 915 | return items, nil |
| 916 | case persistedModuleObjectValueKindObject: |
| 917 | fields := make(map[string]any, len(val.Fields)) |
| 918 | fieldNames := slices.Collect(maps.Keys(val.Fields)) |
| 919 | slices.Sort(fieldNames) |
| 920 | for _, name := range fieldNames { |
| 921 | decoded, err := decodePersistedModuleObjectValue(ctx, dag, val.Fields[name]) |
| 922 | if err != nil { |
| 923 | return nil, fmt.Errorf("field %q: %w", name, err) |
| 924 | } |
| 925 | fields[name] = decoded |
| 926 | } |
| 927 | return fields, nil |
| 928 | default: |
| 929 | return nil, fmt.Errorf("unsupported kind %q", val.Kind) |
| 930 | } |
| 931 | } |
| 932 | |
| 933 | func persistedModuleObjectFieldName(field reflect.StructField) (string, bool) { |
| 934 | if field.PkgPath != "" { |