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