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 {