From 7b98812d7119f44b2ede5e170402647adb1a9d6e Mon Sep 17 00:00:00 2001 From: Ernest Micklei <> Date: Wed, 3 Jan 2018 08:21:13 +0100 Subject: [PATCH] issue #48 : allow multiple enum value options + field.ValueOption -> field.Elements --- enum.go | 29 +++++++++++++++++------------ enum_test.go | 11 ++++++++--- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/enum.go b/enum.go index c51f98b..30fc3d8 100644 --- a/enum.go +++ b/enum.go @@ -119,7 +119,7 @@ type EnumField struct { Comment *Comment Name string Integer int - ValueOption *Option + Elements []Visitee // such as Option and Comment InlineComment *Comment } @@ -157,17 +157,22 @@ func (f *EnumField) parse(p *Parser) error { f.Integer = i pos, tok, lit = p.next() if tok == tLEFTSQUARE { - o := new(Option) - o.Position = pos - o.IsEmbedded = true - err := o.parse(p) - if err != nil { - return err - } - f.ValueOption = o - pos, tok, lit = p.next() - if tok != tRIGHTSQUARE { - return p.unexpected(lit, "option closing ]", f) + for { + o := new(Option) + o.Position = pos + o.IsEmbedded = true + err := o.parse(p) + if err != nil { + return err + } + f.Elements = append(f.Elements, o) + pos, tok, lit = p.next() + if tok == tCOMMA { + continue + } + if tok == tRIGHTSQUARE { + break + } } } if tSEMICOLON == tok { diff --git a/enum_test.go b/enum_test.go index 6123a8a..2b734d1 100644 --- a/enum_test.go +++ b/enum_test.go @@ -34,6 +34,10 @@ enum EnumAllowingAlias { STARTED = 1; RUNNING = 2 [(custom_option) = "hello world"]; NEG = -42; + SOMETHING_FOO = 0 [ + (bar.enum_value_option) = true, + (bar.enum_value_dep_option) = { hello: 1 } + ]; }` p := newParserOn(proto) pr, err := p.Parse() @@ -44,7 +48,7 @@ enum EnumAllowingAlias { if got, want := len(enums), 1; got != want { t.Errorf("got [%v] want [%v]", got, want) } - if got, want := len(enums[0].Elements), 5; got != want { + if got, want := len(enums[0].Elements), 6; got != want { t.Errorf("got [%v] want [%v]", got, want) } if got, want := enums[0].Comment != nil, true; got != want { @@ -67,10 +71,11 @@ enum EnumAllowingAlias { if got, want := ef3.Integer, 2; got != want { t.Errorf("got [%v] want [%v]", got, want) } - if got, want := ef3.ValueOption.Name, "(custom_option)"; got != want { + ef3opt := ef3.Elements[0].(*Option) + if got, want := ef3opt.Name, "(custom_option)"; got != want { t.Errorf("got [%v] want [%v]", got, want) } - if got, want := ef3.ValueOption.Constant.Source, "hello world"; got != want { + if got, want := ef3opt.Constant.Source, "hello world"; got != want { t.Errorf("got [%v] want [%v]", got, want) } if got, want := ef3.Position.Line, 7; got != want {