5
0
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:
Lea Anthony 2021-01-03 22:05:40 +11:00
parent 5d41aad539
commit 0dc6c20c65
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405

View File

@ -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
//
} //}