Accept comma and semicolon characters in text format maps.
This makes this consistent with the C++ parser and structs in general.
diff --git a/proto/text_parser.go b/proto/text_parser.go
index d1caeff..5c466d5 100644
--- a/proto/text_parser.go
+++ b/proto/text_parser.go
@@ -567,6 +567,9 @@
if err := p.readAny(key, props.mkeyprop); err != nil {
return err
}
+ if err := p.consumeOptionalSeparator(); err != nil {
+ return err
+ }
if err := p.consumeToken("value"); err != nil {
return err
}
@@ -576,6 +579,9 @@
if err := p.readAny(val, props.mvalprop); err != nil {
return err
}
+ if err := p.consumeOptionalSeparator(); err != nil {
+ return err
+ }
if err := p.consumeToken(terminator); err != nil {
return err
}
@@ -605,14 +611,10 @@
}
}
- // For backward compatibility, permit a semicolon or comma after a field.
- tok = p.next()
- if tok.err != nil {
- return tok.err
+ if err := p.consumeOptionalSeparator(); err != nil {
+ return err
}
- if tok.value != ";" && tok.value != "," {
- p.back()
- }
+
}
if reqCount > 0 {
@@ -621,6 +623,19 @@
return reqFieldErr
}
+// consumeOptionalSeparator consumes an optional semicolon or comma.
+// It is used in readStruct to provide backward compatibility.
+func (p *textParser) consumeOptionalSeparator() error {
+ tok := p.next()
+ if tok.err != nil {
+ return tok.err
+ }
+ if tok.value != ";" && tok.value != "," {
+ p.back()
+ }
+ return nil
+}
+
func (p *textParser) readAny(v reflect.Value, props *Properties) error {
tok := p.next()
if tok.err != nil {
diff --git a/proto/text_parser_test.go b/proto/text_parser_test.go
index 2e51da3..cfc0db6 100644
--- a/proto/text_parser_test.go
+++ b/proto/text_parser_test.go
@@ -462,7 +462,7 @@
func TestMapParsing(t *testing.T) {
m := new(MessageWithMap)
const in = `name_mapping:<key:1234 value:"Feist"> name_mapping:<key:1 value:"Beatles">` +
- `msg_mapping:<key:-4 value:<f: 2.0>>` +
+ `msg_mapping:<key:-4, value:<f: 2.0>,>` + // separating commas are okay
`msg_mapping<key:-2 value<f: 4.0>>` + // no colon after "value"
`byte_mapping:<key:true value:"so be it">`
want := &MessageWithMap{