Improve error message when text unmarshaling a nested message with a required field. Signed-off-by: David Symonds <dsymonds@golang.org>
diff --git a/proto/testdata/test.proto b/proto/testdata/test.proto index 698c8ce..f607113 100644 --- a/proto/testdata/test.proto +++ b/proto/testdata/test.proto
@@ -237,6 +237,10 @@ extensions 100 to max; } +message RequiredInnerMessage { + required InnerMessage leo_finally_won_an_oscar = 1; +} + message MyMessage { required int32 count = 1; optional string name = 2; @@ -244,6 +248,7 @@ repeated string pet = 4; optional InnerMessage inner = 5; repeated OtherMessage others = 6; + optional RequiredInnerMessage we_must_go_deeper = 13; repeated InnerMessage rep_inner = 12; enum Color {
diff --git a/proto/text_parser.go b/proto/text_parser.go index b5e1c8e..b5fba5b 100644 --- a/proto/text_parser.go +++ b/proto/text_parser.go
@@ -663,7 +663,8 @@ return err } reqFieldErr = err - } else if props.Required { + } + if props.Required { reqCount-- }
diff --git a/proto/text_parser_test.go b/proto/text_parser_test.go index d2e4cca..32c4117 100644 --- a/proto/text_parser_test.go +++ b/proto/text_parser_test.go
@@ -336,6 +336,16 @@ }, }, + // Missing required field in a required submessage + { + in: `count: 42 we_must_go_deeper < leo_finally_won_an_oscar <> >`, + err: `proto: required field "testdata.InnerMessage.host" not set`, + out: &MyMessage{ + Count: Int32(42), + WeMustGoDeeper: &RequiredInnerMessage{LeoFinallyWonAnOscar: &InnerMessage{}}, + }, + }, + // Repeated non-repeated field { in: `name: "Rob" name: "Russ"`,