diff options
author | David Anderson <dave@natulte.net> | 2015-08-21 17:12:18 -0700 |
---|---|---|
committer | David Anderson <dave@natulte.net> | 2015-08-21 17:12:18 -0700 |
commit | b037a616903746de8e647f53503d4edca29192ec (patch) | |
tree | 3045643b1c3243ab76ed54348f1cc6c0fc64965b /callback.go | |
parent | Implement support for variadic functions. (diff) | |
download | golite-b037a616903746de8e647f53503d4edca29192ec.tar.gz golite-b037a616903746de8e647f53503d4edca29192ec.tar.xz |
Add support for interface{} arguments in Go SQLite functions.
This enabled support for functions like Foo(a interface{}) and
Bar(a ...interface{}).
Diffstat (limited to '')
-rw-r--r-- | callback.go | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/callback.go b/callback.go index 1692106..b1704fe 100644 --- a/callback.go +++ b/callback.go @@ -108,8 +108,32 @@ func callbackArgString(v *C.sqlite3_value) (reflect.Value, error) { } } +func callbackArgGeneric(v *C.sqlite3_value) (reflect.Value, error) { + switch C.sqlite3_value_type(v) { + case C.SQLITE_INTEGER: + return callbackArgInt64(v) + case C.SQLITE_FLOAT: + return callbackArgFloat64(v) + case C.SQLITE_TEXT: + return callbackArgString(v) + case C.SQLITE_BLOB: + return callbackArgBytes(v) + case C.SQLITE_NULL: + // Interpret NULL as a nil byte slice. + var ret []byte + return reflect.ValueOf(ret), nil + default: + panic("unreachable") + } +} + func callbackArg(typ reflect.Type) (callbackArgConverter, error) { switch typ.Kind() { + case reflect.Interface: + if typ.NumMethod() != 0 { + return nil, errors.New("the only supported interface type is interface{}") + } + return callbackArgGeneric, nil case reflect.Slice: if typ.Elem().Kind() != reflect.Uint8 { return nil, errors.New("the only supported slice type is []byte") |