go-promises/value.go
2024-12-27 15:29:47 -06:00

67 lines
1.3 KiB
Go

package promises
import (
"encoding/json"
"fmt"
"syscall/js"
)
func ValueOf(val any) (js.Value, error) {
switch v := val.(type) {
case js.Value:
return v, nil
case js.Func:
return js.ValueOf(v), nil
case nil:
return js.Null(), nil
case bool:
return js.ValueOf(v), nil
case int:
return js.ValueOf(v), nil
case int8:
return js.ValueOf(v), nil
case int16:
return js.ValueOf(v), nil
case int32:
return js.ValueOf(v), nil
case int64:
return js.ValueOf(v), nil
case uint:
return js.ValueOf(v), nil
case uint8:
return js.ValueOf(v), nil
case uint16:
return js.ValueOf(v), nil
case uint32:
return js.ValueOf(v), nil
case uint64:
return js.ValueOf(v), nil
case float32:
return js.ValueOf(v), nil
case float64:
return js.ValueOf(v), nil
case string:
return js.ValueOf(v), nil
case []any:
return js.ValueOf(v), nil
case map[string]any:
return js.ValueOf(v), nil
case []byte:
return js.ValueOf(string(v)), nil
default:
by, marshalErr := json.Marshal(val)
if marshalErr == nil {
m := make(map[string]any)
unmarshallErr := json.Unmarshal(by, &m)
if unmarshallErr == nil {
return js.ValueOf(m), nil
}
s := []any{}
unmarshallErr = json.Unmarshal(by, &s)
if unmarshallErr == nil {
return js.ValueOf(s), nil
}
}
}
return js.Value{}, fmt.Errorf("unable to create a JS value for %T", val)
}