| Index: service/datastore/datastore.go
|
| diff --git a/service/datastore/datastore.go b/service/datastore/datastore.go
|
| index 0580ee85fed3125c70d9e843bebf13a78dad7c41..68fae10a88300f0fe0773b21bfb45a09654af4a1 100644
|
| --- a/service/datastore/datastore.go
|
| +++ b/service/datastore/datastore.go
|
| @@ -165,10 +165,10 @@ func (d *datastoreImpl) Count(q *Query) (int64, error) {
|
| func (d *datastoreImpl) GetAll(q *Query, dst interface{}) error {
|
| v := reflect.ValueOf(dst)
|
| if v.Kind() != reflect.Ptr {
|
| - return fmt.Errorf("invalid GetAll dst: must have a ptr-to-slice: %T", dst)
|
| + panic(fmt.Errorf("invalid GetAll dst: must have a ptr-to-slice: %T", dst))
|
| }
|
| if !v.IsValid() || v.IsNil() {
|
| - return errors.New("invalid GetAll dst: <nil>")
|
| + panic(errors.New("invalid GetAll dst: <nil>"))
|
| }
|
|
|
| if keys, ok := dst.(*[]*Key); ok {
|
| @@ -190,7 +190,7 @@ func (d *datastoreImpl) GetAll(q *Query, dst interface{}) error {
|
| slice := v.Elem()
|
| mat := parseMultiArg(slice.Type())
|
| if mat.newElem == nil {
|
| - return fmt.Errorf("invalid GetAll input type: %T", dst)
|
| + panic(fmt.Errorf("invalid GetAll dst (non-concrete element type): %T", dst))
|
| }
|
|
|
| errs := map[int]error{}
|
| @@ -218,17 +218,23 @@ func (d *datastoreImpl) GetAll(q *Query, dst interface{}) error {
|
| return err
|
| }
|
|
|
| -func isOkType(v reflect.Type) bool {
|
| - if v == typeOfKey {
|
| - return false
|
| +func isOkType(t reflect.Type) error {
|
| + if t == nil {
|
| + return errors.New("no type information")
|
| }
|
| - if v.Implements(typeOfPropertyLoadSaver) {
|
| - return true
|
| + if t.Implements(typeOfPropertyLoadSaver) {
|
| + return nil
|
| + }
|
| + if t == typeOfKey {
|
| + return errors.New("not user datatype")
|
| + }
|
| + if t.Kind() != reflect.Ptr {
|
| + return errors.New("not a pointer")
|
| }
|
| - if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct {
|
| - return true
|
| + if t.Elem().Kind() != reflect.Struct {
|
| + return errors.New("does not point to a struct")
|
| }
|
| - return false
|
| + return nil
|
| }
|
|
|
| func (d *datastoreImpl) ExistsMulti(keys []*Key) ([]bool, error) {
|
| @@ -256,15 +262,15 @@ func (d *datastoreImpl) Exists(k *Key) (bool, error) {
|
| }
|
|
|
| func (d *datastoreImpl) Get(dst interface{}) (err error) {
|
| - if !isOkType(reflect.TypeOf(dst)) {
|
| - return fmt.Errorf("invalid Get input type: %T", dst)
|
| + if err := isOkType(reflect.TypeOf(dst)); err != nil {
|
| + panic(fmt.Errorf("invalid Get input type (%T): %s", dst, err))
|
| }
|
| return errors.SingleError(d.GetMulti([]interface{}{dst}))
|
| }
|
|
|
| func (d *datastoreImpl) Put(src interface{}) (err error) {
|
| - if !isOkType(reflect.TypeOf(src)) {
|
| - return fmt.Errorf("invalid Put input type: %T", src)
|
| + if err := isOkType(reflect.TypeOf(src)); err != nil {
|
| + panic(fmt.Errorf("invalid Put input type (%T): %s", src, err))
|
| }
|
| return errors.SingleError(d.PutMulti([]interface{}{src}))
|
| }
|
|
|