diff --git a/Makefile b/Makefile index c3b5e27..5d7fd9d 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ build: install-deps run: rm -fr $(OUTPUTDIR) mkdir -p $(OUTPUTDIR) - protoc --plugin=./$(BINDIR)/protoc-gen-openapi --openapi_out=single_file=true,use_ref=true:$(OUTPUTDIR)/. -Itestdata testdata/testpkg/test1.proto testdata/testpkg/test2.proto testdata/testpkg/test6.proto testdata/testpkg2/test3.proto + protoc --plugin=./$(BINDIR)/protoc-gen-openapi --openapi_out=single_file=true,use_ref=true:$(OUTPUTDIR)/. -Itestdata testdata/testpkg/test1.proto testdata/testpkg/test2.proto testdata/testpkg/test6.proto testdata/testpkg2/test3.proto testdata/testpkg/test_proto3_optional.proto gotest: PATH=$(BINDIR):$(PATH) go test -v ./... diff --git a/openapiGenerator.go b/openapiGenerator.go index c7304b7..5a3b2b9 100644 --- a/openapiGenerator.go +++ b/openapiGenerator.go @@ -424,9 +424,13 @@ func (g *openapiGenerator) generateMessageSchema(message *protomodel.MessageDesc oneOfFields := make(map[int32][]string) var requiredFields []string + // Handle proto3 optional fields - they should not be required for _, field := range message.Fields { + if field.Proto3Optional != nil && *field.Proto3Optional { repeated := field.IsRepeated() + // Proto3 optional fields are never required fieldName := g.fieldName(field) + } else if g.markerRegistry.IsRequired(fieldRules) { fieldDesc := g.generateDescription(field) fieldRules := g.validationRules(field) @@ -436,9 +440,10 @@ func (g *openapiGenerator) generateMessageSchema(message *protomodel.MessageDesc oneOfFields[idx] = append(oneOfFields[idx], fieldName) } - if g.markerRegistry.IsRequired(fieldRules) { + // Field is required by marker requiredFields = append(requiredFields, fieldName) } + } schemaType := g.markerRegistry.GetSchemaType(fieldRules, markers.TargetField) if schemaType != "" { @@ -827,3 +832,4 @@ func isIgnoredKubeMarker(regexp *regexp.Regexp, l string) bool { return regexp.MatchString(l) } +