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
import (
"encoding/json"
"fmt"
"reflect"
"runtime"
)
// 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
}
// 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
func isStruct(value interface{}) bool {
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("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
@ -86,38 +96,38 @@ func getMethods(value interface{}) ([]*BoundMethod, error) {
return result, nil
}
// convertArgToValue
func convertArgToValue(input json.RawMessage, target *Parameter) (result reflect.Value, err error) {
// Catch type conversion panics thrown by convert
defer func() {
if r := recover(); r != nil {
// Modify error
err = fmt.Errorf("%s", r.(string)[23:])
}
}()
// Do the conversion
// Handle nil values
if input == nil {
switch target.reflectType.Kind() {
case reflect.Chan,
reflect.Func,
reflect.Interface,
reflect.Map,
reflect.Ptr,
reflect.Slice:
result = reflect.ValueOf(input).Convert(target.reflectType)
default:
return reflect.Zero(target.reflectType), fmt.Errorf("Unable to use null value")
}
} else {
result = reflect.ValueOf(input).Convert(target.reflectType)
}
// We don't like doing this but it's the only way to
// handle recover() correctly
return
}
//// convertArgToValue
//func convertArgToValue(input json.RawMessage, target *Parameter) (result reflect.Value, err error) {
//
// // Catch type conversion panics thrown by convert
// defer func() {
// if r := recover(); r != nil {
// // Modify error
// err = fmt.Errorf("%s", r.(string)[23:])
// }
// }()
//
// // Do the conversion
//
// // Handle nil values
// if input == nil {
// switch target.reflectType.Kind() {
// case reflect.Chan,
// reflect.Func,
// reflect.Interface,
// reflect.Map,
// reflect.Ptr,
// reflect.Slice:
// result = reflect.ValueOf(input).Convert(target.reflectType)
// default:
// return reflect.Zero(target.reflectType), fmt.Errorf("Unable to use null value")
// }
// } else {
// result = reflect.ValueOf(input).Convert(target.reflectType)
// }
//
// // We don't like doing this but it's the only way to
// // handle recover() correctly
// return
//
//}