| Index: impl/memory/testing_utils_test.go
|
| diff --git a/impl/memory/testing_utils_test.go b/impl/memory/testing_utils_test.go
|
| index 66447d078c180cc78b2f96c71ce0b566f9e7e579..6a249167fb8c9b975a1da767b20c0e1129db4666 100644
|
| --- a/impl/memory/testing_utils_test.go
|
| +++ b/impl/memory/testing_utils_test.go
|
| @@ -23,36 +23,63 @@ func init() {
|
| var nextMarker = "NEXT MARKER"
|
| var Next = &nextMarker
|
|
|
| -// Use like:
|
| +var multiMarker = "MULTI MARKER"
|
| +var Multi = &multiMarker
|
| +
|
| +// If you want an entry that is single to be treated as multi-, prepend it
|
| +// with Multi. Terminate each set of property tokens with Next.
|
| // pmap(
|
| // "prop", "val", 0, 100, Next,
|
| // "other", "val", 0, 100, Next,
|
| +// "name", Multi, "value", Next,
|
| // )
|
| //
|
| +//
|
| +//
|
| func pmap(stuff ...interface{}) ds.PropertyMap {
|
| ret := ds.PropertyMap{}
|
|
|
| - nom := func() interface{} {
|
| - if len(stuff) > 0 {
|
| - ret := stuff[0]
|
| - stuff = stuff[1:]
|
| - return ret
|
| + nom := func() (name string, toks []interface{}, multi bool) {
|
| + var i int
|
| +
|
| + for i = 0; i < len(stuff); i++ {
|
| + e := stuff[i]
|
| + switch {
|
| + case e == Next:
|
| + stuff = stuff[i+1:]
|
| + return
|
| + case e == Multi:
|
| + multi = true
|
| + case i == 0:
|
| + name = e.(string)
|
| + default:
|
| + toks = append(toks, e)
|
| + }
|
| }
|
| - return nil
|
| +
|
| + stuff = nil
|
| + return
|
| }
|
|
|
| for len(stuff) > 0 {
|
| - pname := nom().(string)
|
| + pname, toks, multi := nom()
|
| +
|
| + var mp func(interface{}) ds.Property
|
| if pname[0] == '$' || (strings.HasPrefix(pname, "__") && strings.HasSuffix(pname, "__")) {
|
| - for len(stuff) > 0 && stuff[0] != Next {
|
| - ret[pname] = append(ret[pname], propNI(nom()))
|
| - }
|
| + mp = propNI
|
| + } else {
|
| + mp = prop
|
| + }
|
| +
|
| + if len(toks) == 1 && !multi {
|
| + ret[pname] = mp(toks[0])
|
| } else {
|
| - for len(stuff) > 0 && stuff[0] != Next {
|
| - ret[pname] = append(ret[pname], prop(nom()))
|
| + pslice := make(ds.PropertySlice, len(toks))
|
| + for i, tok := range toks {
|
| + pslice[i] = mp(tok)
|
| }
|
| + ret[pname] = pslice
|
| }
|
| - nom()
|
| }
|
|
|
| return ret
|
|
|