func encodeJSON()

in lib/json.go [165:205]


func encodeJSON(val ref.Val) ref.Val {
	var v interface{}
	// Avoid type conversions if possible.
	switch under := val.Value().(type) {
	case map[string]any:
		v = under
	case map[ref.Val]ref.Val:
		pb, err := val.ConvertToNative(structpbValueType)
		if err != nil {
			return types.NewErr("failed proto conversion: %v", err)
		}
		v = pb.(*structpb.Value).AsInterface()
	default:
		var err error
		typ, ok := encodableTypes[val.Type()]
		if ok {
			v, err = val.ConvertToNative(typ)
			if err != nil {
				// This should never happen.
				panic(fmt.Sprintf("json encode mapping out of sync: %v", err))
			}
		} else {
			for _, typ := range protobufTypes {
				v, err = val.ConvertToNative(typ)
				if err != nil {
					v = nil
				} else {
					break
				}
			}
		}
		if v == nil {
			return types.NewErr("failed to get native value for JSON")
		}
	}
	b, err := json.Marshal(v)
	if err != nil {
		return types.NewErr("failed to marshal value to JSON: %v", err)
	}
	return types.String(b)
}