| Index: service/datastore/multiarg.go
|
| diff --git a/service/datastore/multiarg.go b/service/datastore/multiarg.go
|
| index cc1a6726510f6817887f6539a42ba276c780e78b..0e24feb041d44c069268c033cba666d3167f9781 100644
|
| --- a/service/datastore/multiarg.go
|
| +++ b/service/datastore/multiarg.go
|
| @@ -12,8 +12,6 @@ import (
|
| )
|
|
|
| type multiArgType struct {
|
| - valid bool
|
| -
|
| getKey func(aid, ns string, slot reflect.Value) (*Key, error)
|
| getPM func(slot reflect.Value) (PropertyMap, error)
|
| getMetaPM func(slot reflect.Value) PropertyMap
|
| @@ -50,15 +48,15 @@ func (mat *multiArgType) GetKeysPMs(aid, ns string, slice reflect.Value, meta bo
|
| // type P such that P or *P implements PropertyLoadSaver.
|
| func parseMultiArg(e reflect.Type) multiArgType {
|
| if e.Kind() != reflect.Slice {
|
| - return multiArgTypeInvalid()
|
| + panic(fmt.Errorf("invalid argument type: expected slice, got %s", e))
|
| }
|
| - return parseArg(e.Elem())
|
| + return parseArg(e.Elem(), true)
|
| }
|
|
|
| // parseArg checks that et is of type S, *S, I, P or *P, for some
|
| // struct type S, for some interface type I, or some non-interface non-pointer
|
| // type P such that P or *P implements PropertyLoadSaver.
|
| -func parseArg(et reflect.Type) multiArgType {
|
| +func parseArg(et reflect.Type, multi bool) multiArgType {
|
| if reflect.PtrTo(et).Implements(typeOfPropertyLoadSaver) {
|
| return multiArgTypePLS(et)
|
| }
|
| @@ -76,21 +74,18 @@ func parseArg(et reflect.Type) multiArgType {
|
| return multiArgTypeStructPtr(et)
|
| }
|
| }
|
| - return multiArgTypeInvalid()
|
| + if multi {
|
| + panic(fmt.Errorf("invalid argument type: []%s", et))
|
| + }
|
| + panic(fmt.Errorf("invalid argument type: %s", et))
|
| }
|
|
|
| type newKeyFunc func(kind, sid string, iid int64, par Key) Key
|
|
|
| -func multiArgTypeInvalid() multiArgType {
|
| - return multiArgType{}
|
| -}
|
| -
|
| // multiArgTypePLS == []P
|
| // *P implements PropertyLoadSaver
|
| func multiArgTypePLS(et reflect.Type) multiArgType {
|
| ret := multiArgType{
|
| - valid: true,
|
| -
|
| getKey: func(aid, ns string, slot reflect.Value) (*Key, error) {
|
| return newKeyObjErr(aid, ns, slot.Addr().Interface())
|
| },
|
| @@ -128,8 +123,6 @@ func multiArgTypePLS(et reflect.Type) multiArgType {
|
| // *P implements PropertyLoadSaver
|
| func multiArgTypePLSPtr(et reflect.Type) multiArgType {
|
| ret := multiArgType{
|
| - valid: true,
|
| -
|
| getKey: func(aid, ns string, slot reflect.Value) (*Key, error) {
|
| return newKeyObjErr(aid, ns, slot.Interface())
|
| },
|
| @@ -161,15 +154,10 @@ func multiArgTypePLSPtr(et reflect.Type) multiArgType {
|
| // multiArgTypeStruct == []S
|
| func multiArgTypeStruct(et reflect.Type) multiArgType {
|
| cdc := getCodec(et)
|
| - if cdc.problem != nil {
|
| - return multiArgTypeInvalid()
|
| - }
|
| toPLS := func(slot reflect.Value) *structPLS {
|
| return &structPLS{slot, cdc}
|
| }
|
| return multiArgType{
|
| - valid: true,
|
| -
|
| getKey: func(aid, ns string, slot reflect.Value) (*Key, error) {
|
| return newKeyObjErr(aid, ns, toPLS(slot))
|
| },
|
| @@ -197,15 +185,10 @@ func multiArgTypeStruct(et reflect.Type) multiArgType {
|
| // multiArgTypeStructPtr == []*S
|
| func multiArgTypeStructPtr(et reflect.Type) multiArgType {
|
| cdc := getCodec(et)
|
| - if cdc.problem != nil {
|
| - return multiArgTypeInvalid()
|
| - }
|
| toPLS := func(slot reflect.Value) *structPLS {
|
| return &structPLS{slot.Elem(), cdc}
|
| }
|
| return multiArgType{
|
| - valid: true,
|
| -
|
| getKey: func(aid, ns string, slot reflect.Value) (*Key, error) {
|
| return newKeyObjErr(aid, ns, toPLS(slot))
|
| },
|
| @@ -233,22 +216,17 @@ func multiArgTypeStructPtr(et reflect.Type) multiArgType {
|
| // multiArgTypeInterface == []I
|
| func multiArgTypeInterface() multiArgType {
|
| return multiArgType{
|
| - valid: true,
|
| -
|
| getKey: func(aid, ns string, slot reflect.Value) (*Key, error) {
|
| return newKeyObjErr(aid, ns, slot.Elem().Interface())
|
| },
|
| getPM: func(slot reflect.Value) (PropertyMap, error) {
|
| - pls := mkPLS(slot.Elem().Interface())
|
| - return pls.Save(true)
|
| + return mkPLS(slot.Elem().Interface()).Save(true)
|
| },
|
| getMetaPM: func(slot reflect.Value) PropertyMap {
|
| - pls := getMGS(slot.Elem().Interface())
|
| - return pls.GetAllMeta()
|
| + return getMGS(slot.Elem().Interface()).GetAllMeta()
|
| },
|
| setPM: func(slot reflect.Value, pm PropertyMap) error {
|
| - pls := mkPLS(slot.Elem().Interface())
|
| - return pls.Load(pm)
|
| + return mkPLS(slot.Elem().Interface()).Load(pm)
|
| },
|
| setKey: func(slot reflect.Value, k *Key) {
|
| setKey(slot.Elem().Interface(), k)
|
| @@ -258,37 +236,37 @@ func multiArgTypeInterface() multiArgType {
|
|
|
| func newKeyObjErr(aid, ns string, src interface{}) (*Key, error) {
|
| pls := getMGS(src)
|
| - if key, _ := pls.GetMetaDefault("key", nil).(*Key); key != nil {
|
| + if key, _ := GetMetaDefault(pls, "key", nil).(*Key); key != nil {
|
| return key, nil
|
| }
|
|
|
| // get kind
|
| - kind := pls.GetMetaDefault("kind", "").(string)
|
| + kind := GetMetaDefault(pls, "kind", "").(string)
|
| if kind == "" {
|
| return nil, fmt.Errorf("unable to extract $kind from %T", src)
|
| }
|
|
|
| // get id - allow both to be default for default keys
|
| - sid := pls.GetMetaDefault("id", "").(string)
|
| - iid := pls.GetMetaDefault("id", 0).(int64)
|
| + sid := GetMetaDefault(pls, "id", "").(string)
|
| + iid := GetMetaDefault(pls, "id", 0).(int64)
|
|
|
| // get parent
|
| - par, _ := pls.GetMetaDefault("parent", nil).(*Key)
|
| + par, _ := GetMetaDefault(pls, "parent", nil).(*Key)
|
|
|
| return NewKey(aid, ns, kind, sid, iid, par), nil
|
| }
|
|
|
| func setKey(src interface{}, key *Key) {
|
| pls := getMGS(src)
|
| - if pls.SetMeta("key", key) == ErrMetaFieldUnset {
|
| + if !pls.SetMeta("key", key) {
|
| lst := key.LastTok()
|
| if lst.StringID != "" {
|
| - _ = pls.SetMeta("id", lst.StringID)
|
| + pls.SetMeta("id", lst.StringID)
|
| } else {
|
| - _ = pls.SetMeta("id", lst.IntID)
|
| + pls.SetMeta("id", lst.IntID)
|
| }
|
| - _ = pls.SetMeta("kind", lst.Kind)
|
| - _ = pls.SetMeta("parent", key.Parent())
|
| + pls.SetMeta("kind", lst.Kind)
|
| + pls.SetMeta("parent", key.Parent())
|
| }
|
| }
|
|
|
|
|