67 lines
1.3 KiB
Go
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)
|
|
}
|