Skip to content

Commit 57fe2b7

Browse files
committed
Support returning any from callbacks
Add test Fix test
1 parent aa1e904 commit 57fe2b7

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

callback.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,13 +353,27 @@ func callbackRetNil(ctx *C.sqlite3_context, v reflect.Value) error {
353353
return nil
354354
}
355355

356+
func callbackRetAny(ctx *C.sqlite3_context, v reflect.Value) error {
357+
cb, err := callbackRet(v.Elem().Type())
358+
if err != nil {
359+
return err
360+
}
361+
362+
return cb(ctx, v.Elem())
363+
}
364+
356365
func callbackRet(typ reflect.Type) (callbackRetConverter, error) {
357366
switch typ.Kind() {
358367
case reflect.Interface:
359368
errorInterface := reflect.TypeOf((*error)(nil)).Elem()
360369
if typ.Implements(errorInterface) {
361370
return callbackRetNil, nil
362371
}
372+
373+
if typ.NumMethod() == 0 {
374+
return callbackRetAny, nil
375+
}
376+
363377
fallthrough
364378
case reflect.Slice:
365379
if typ.Elem().Kind() != reflect.Uint8 {

callback_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,15 @@ func TestCallbackConverters(t *testing.T) {
102102
}
103103
}
104104
}
105+
106+
func TestCallbackReturnAny(t *testing.T) {
107+
udf := func() interface{} {
108+
return 1
109+
}
110+
111+
typ := reflect.TypeOf(udf)
112+
_, err := callbackRet(typ.Out(0))
113+
if err != nil {
114+
t.Errorf("Expected valid callback for any return type, got: %s", err)
115+
}
116+
}

0 commit comments

Comments
 (0)