datastore: permit multiple struct field tag options
Change-Id: Iab7b33d8a2ab787d36319cdb8812b66078d6e567
diff --git a/datastore/datastore_test.go b/datastore/datastore_test.go
index 960c0f1..b2856a9 100644
--- a/datastore/datastore_test.go
+++ b/datastore/datastore_test.go
@@ -218,6 +218,9 @@
C int `datastore:",noindex"`
D int `datastore:""`
E int
+ // The "flatten" option is parsed but ignored for now.
+ F int `datastore:",noindex,flatten"`
+ G int `datastore:",flatten"`
I int `datastore:"-"`
J int `datastore:",noindex" json:"j"`
@@ -719,7 +722,7 @@
},
{
"save tagged load props",
- &Tagged{A: 1, B: []int{21, 22, 23}, C: 3, D: 4, E: 5, I: 6, J: 7},
+ &Tagged{A: 1, B: []int{21, 22, 23}, C: 3, D: 4, E: 5, F: 6, G: 7, I: 8, J: 9},
&PropertyList{
// A and B are renamed to a and b; A and C are noindex, I is ignored.
// Indexed properties are loaded before raw properties. Thus, the
@@ -729,9 +732,11 @@
Property{Name: "b", Value: int64(23), NoIndex: false, Multiple: true},
Property{Name: "D", Value: int64(4), NoIndex: false, Multiple: false},
Property{Name: "E", Value: int64(5), NoIndex: false, Multiple: false},
+ Property{Name: "G", Value: int64(7), NoIndex: false, Multiple: false},
Property{Name: "a", Value: int64(1), NoIndex: true, Multiple: false},
Property{Name: "C", Value: int64(3), NoIndex: true, Multiple: false},
- Property{Name: "J", Value: int64(7), NoIndex: true, Multiple: false},
+ Property{Name: "F", Value: int64(6), NoIndex: true, Multiple: false},
+ Property{Name: "J", Value: int64(9), NoIndex: true, Multiple: false},
},
"",
"",
diff --git a/datastore/prop.go b/datastore/prop.go
index 3caef9a..1f50ac0 100644
--- a/datastore/prop.go
+++ b/datastore/prop.go
@@ -187,9 +187,11 @@
for i := range c.byIndex {
f := t.Field(i)
- name, opts := f.Tag.Get("datastore"), ""
- if i := strings.Index(name, ","); i != -1 {
- name, opts = name[:i], name[i+1:]
+ tags := strings.Split(f.Tag.Get("datastore"), ",")
+ name := tags[0]
+ opts := make(map[string]bool)
+ for _, t := range tags[1:] {
+ opts[t] = true
}
if name == "" {
if !f.Anonymous {
@@ -246,7 +248,7 @@
c.byIndex[i] = structTag{
name: name,
- noIndex: opts == "noindex",
+ noIndex: opts["noindex"],
}
}
c.complete = true