mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 06:01:52 +08:00
Provide a better error message when trying to bind functions
This commit is contained in:
parent
5d41aad539
commit
0dc6c20c65
@ -1,9 +1,9 @@
|
|||||||
package binding
|
package binding
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
// isStructPtr returns true if the value given is a
|
// isStructPtr returns true if the value given is a
|
||||||
@ -13,6 +13,11 @@ func isStructPtr(value interface{}) bool {
|
|||||||
reflect.ValueOf(value).Elem().Kind() == reflect.Struct
|
reflect.ValueOf(value).Elem().Kind() == reflect.Struct
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isFunction returns true if the given value is a function
|
||||||
|
func isFunction(value interface{}) bool {
|
||||||
|
return reflect.ValueOf(value).Kind() == reflect.Func
|
||||||
|
}
|
||||||
|
|
||||||
// isStructPtr returns true if the value given is a struct
|
// isStructPtr returns true if the value given is a struct
|
||||||
func isStruct(value interface{}) bool {
|
func isStruct(value interface{}) bool {
|
||||||
return reflect.ValueOf(value).Kind() == reflect.Struct
|
return reflect.ValueOf(value).Kind() == reflect.Struct
|
||||||
@ -31,7 +36,12 @@ func getMethods(value interface{}) ([]*BoundMethod, error) {
|
|||||||
return nil, fmt.Errorf("%s is a struct, not a pointer to a struct", name)
|
return nil, fmt.Errorf("%s is a struct, not a pointer to a struct", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, fmt.Errorf("not a pointer to a struct")
|
if isFunction(value) {
|
||||||
|
name := runtime.FuncForPC(reflect.ValueOf(value).Pointer()).Name()
|
||||||
|
return nil, fmt.Errorf("%s is a function, not a pointer to a struct. Wails v2 has deprecated the binding of functions. Please wrap your functions up in a struct and bind a pointer to that struct.", name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf("not a pointer to a struct.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process Struct
|
// Process Struct
|
||||||
@ -86,38 +96,38 @@ func getMethods(value interface{}) ([]*BoundMethod, error) {
|
|||||||
return result, nil
|
return result, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertArgToValue
|
//// convertArgToValue
|
||||||
func convertArgToValue(input json.RawMessage, target *Parameter) (result reflect.Value, err error) {
|
//func convertArgToValue(input json.RawMessage, target *Parameter) (result reflect.Value, err error) {
|
||||||
|
//
|
||||||
// Catch type conversion panics thrown by convert
|
// // Catch type conversion panics thrown by convert
|
||||||
defer func() {
|
// defer func() {
|
||||||
if r := recover(); r != nil {
|
// if r := recover(); r != nil {
|
||||||
// Modify error
|
// // Modify error
|
||||||
err = fmt.Errorf("%s", r.(string)[23:])
|
// err = fmt.Errorf("%s", r.(string)[23:])
|
||||||
}
|
// }
|
||||||
}()
|
// }()
|
||||||
|
//
|
||||||
// Do the conversion
|
// // Do the conversion
|
||||||
|
//
|
||||||
// Handle nil values
|
// // Handle nil values
|
||||||
if input == nil {
|
// if input == nil {
|
||||||
switch target.reflectType.Kind() {
|
// switch target.reflectType.Kind() {
|
||||||
case reflect.Chan,
|
// case reflect.Chan,
|
||||||
reflect.Func,
|
// reflect.Func,
|
||||||
reflect.Interface,
|
// reflect.Interface,
|
||||||
reflect.Map,
|
// reflect.Map,
|
||||||
reflect.Ptr,
|
// reflect.Ptr,
|
||||||
reflect.Slice:
|
// reflect.Slice:
|
||||||
result = reflect.ValueOf(input).Convert(target.reflectType)
|
// result = reflect.ValueOf(input).Convert(target.reflectType)
|
||||||
default:
|
// default:
|
||||||
return reflect.Zero(target.reflectType), fmt.Errorf("Unable to use null value")
|
// return reflect.Zero(target.reflectType), fmt.Errorf("Unable to use null value")
|
||||||
}
|
// }
|
||||||
} else {
|
// } else {
|
||||||
result = reflect.ValueOf(input).Convert(target.reflectType)
|
// result = reflect.ValueOf(input).Convert(target.reflectType)
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// We don't like doing this but it's the only way to
|
// // We don't like doing this but it's the only way to
|
||||||
// handle recover() correctly
|
// // handle recover() correctly
|
||||||
return
|
// return
|
||||||
|
//
|
||||||
}
|
//}
|
||||||
|
Loading…
Reference in New Issue
Block a user