diff --git a/internal/converter/testdata/proto2_nested_object.go b/internal/converter/testdata/proto2_nested_object.go index 2da65bca..dea5b2a9 100644 --- a/internal/converter/testdata/proto2_nested_object.go +++ b/internal/converter/testdata/proto2_nested_object.go @@ -10,8 +10,8 @@ const Proto2NestedObject = `{ "payload": { "required": [ "name", - "id", "timestamp", + "id", "rating", "complete", "topology" diff --git a/internal/converter/types.go b/internal/converter/types.go index b25fad7f..b0b2d7f4 100644 --- a/internal/converter/types.go +++ b/internal/converter/types.go @@ -274,11 +274,12 @@ func (c *Converter) convertField(curPkg *ProtoPackage, desc *descriptor.FieldDes jsonSchemaType.Type = gojsonschema.TYPE_ARRAY // Build up the list of required fields: - if c.Flags.AllFieldsRequired && recursedJSONSchemaType.Properties != nil { + if c.Flags.AllFieldsRequired && len(recursedJSONSchemaType.OneOf) == 0 && recursedJSONSchemaType.Properties != nil { for _, property := range recursedJSONSchemaType.Properties.Keys() { jsonSchemaType.Items.Required = append(jsonSchemaType.Items.Required, property) } } + jsonSchemaType.Items.Required = dedupe(jsonSchemaType.Items.Required) // Not maps, not arrays: default: @@ -299,7 +300,7 @@ func (c *Converter) convertField(curPkg *ProtoPackage, desc *descriptor.FieldDes jsonSchemaType.Required = recursedJSONSchemaType.Required // Build up the list of required fields: - if c.Flags.AllFieldsRequired && recursedJSONSchemaType.Properties != nil { + if c.Flags.AllFieldsRequired && len(recursedJSONSchemaType.OneOf) == 0 && recursedJSONSchemaType.Properties != nil { for _, property := range recursedJSONSchemaType.Properties.Keys() { jsonSchemaType.Required = append(jsonSchemaType.Required, property) } @@ -526,6 +527,13 @@ func (c *Converter) recursiveConvertMessageType(curPkg *ProtoPackage, msg *descr jsonSchemaType.Properties.Set(fieldDesc.GetName(), recursedJSONSchemaType) } + // Enforce all_fields_required: + if c.Flags.AllFieldsRequired && len(jsonSchemaType.OneOf) == 0 && jsonSchemaType.Properties != nil { + for _, property := range jsonSchemaType.Properties.Keys() { + jsonSchemaType.Required = append(jsonSchemaType.Required, property) + } + } + // Look for required fields by the proto2 "required" flag: if fieldDesc.GetLabel() == descriptor.FieldDescriptorProto_LABEL_REQUIRED && fieldDesc.OneofIndex == nil { jsonSchemaType.Required = append(jsonSchemaType.Required, fieldDesc.GetName()) @@ -543,6 +551,9 @@ func (c *Converter) recursiveConvertMessageType(curPkg *ProtoPackage, msg *descr jsonSchemaType.Properties = nil } + // Dedupe required fields: + jsonSchemaType.Required = dedupe(jsonSchemaType.Required) + return jsonSchemaType, nil }