Chromium Code Reviews| Index: client/flagpb/unmarshal.go |
| diff --git a/client/flagpb/unmarshal.go b/client/flagpb/unmarshal.go |
| index c2a5486e639ed4975a0705d5cd79b2f869d37f82..b02b47bebf6b0e7be27f6e0bc89c579bccad2662 100644 |
| --- a/client/flagpb/unmarshal.go |
| +++ b/client/flagpb/unmarshal.go |
| @@ -93,14 +93,20 @@ func (p *parser) parseOneFlag(flags []string, root message) (flagsRest []string, |
| lastMsg := pathMsgs[len(pathMsgs)-1] |
| target = &lastMsg.message |
| } |
| - |
| - // Resolve last field name. |
| name := fieldPath[len(fieldPath)-1] |
| - fi := target.desc.FindField(name) |
| - if fi == -1 { |
| - return nil, fmt.Errorf("field %s not found in message %s", name, target.desc.GetName()) |
| + |
| + // Resolve target field. |
| + var fieldIndex int |
| + if target.desc.GetOptions().GetMapEntry() { |
| + if fieldIndex = target.desc.FindField("value"); fieldIndex == -1 { |
| + return nil, fmt.Errorf("map entry type %s does not have value field", target.desc.GetName()) |
| + } |
| + } else { |
| + if fieldIndex = target.desc.FindField(name); fieldIndex == -1 { |
| + return nil, fmt.Errorf("field %s not found in message %s", name, target.desc.GetName()) |
| + } |
| } |
| - field := target.desc.Field[fi] |
| + field := target.desc.Field[fieldIndex] |
| var value interface{} |
| hasValue := false |
| @@ -176,12 +182,19 @@ func (p *parser) subMessages(root message, path []string) ([]subMsg, error) { |
| parent := &root |
| for i, name := range path { |
| curPath := path[:i+1] |
| - fi := parent.desc.FindField(name) |
| - if fi == -1 { |
| - return nil, fmt.Errorf("field %q not found in message %s", name, parent.desc.GetName()) |
| + |
| + var fieldIndex int |
| + if parent.desc.GetOptions().GetMapEntry() { |
| + if fieldIndex = parent.desc.FindField("value"); fieldIndex == -1 { |
| + return nil, fmt.Errorf("map entry type %s does not have value field", parent.desc.GetName()) |
| + } |
| + } else { |
| + if fieldIndex = parent.desc.FindField(name); fieldIndex == -1 { |
| + return nil, fmt.Errorf("field %q not found in message %s", name, parent.desc.GetName()) |
| + } |
|
nodir
2016/04/30 04:43:58
deduping this would causes an obscure abstraction
|
| } |
| - f := parent.desc.Field[fi] |
| + f := parent.desc.Field[fieldIndex] |
| if f.GetType() != descriptor.FieldDescriptorProto_TYPE_MESSAGE { |
| return nil, fmt.Errorf("field %s is not a message", strings.Join(curPath, ".")) |
| } |
| @@ -197,7 +210,7 @@ func (p *parser) subMessages(root message, path []string) ([]subMsg, error) { |
| sub := subMsg{ |
| message: message{desc: subDesc}, |
| - repeated: f.Repeated(), |
| + repeated: f.Repeated() && !subDesc.GetOptions().GetMapEntry(), |
| path: curPath, |
| } |
| if value, ok := parent.data[name]; !ok { |