in cdk/extra/protobuf/protobuf-3.19.6/src/google/protobuf/descriptor.cc [6794:6864]
bool DescriptorBuilder::ValidateMapEntry(FieldDescriptor* field,
const FieldDescriptorProto& proto) {
const Descriptor* message = field->message_type();
if ( // Must not contain extensions, extension range or nested message or
// enums
message->extension_count() != 0 ||
field->label() != FieldDescriptor::LABEL_REPEATED ||
message->extension_range_count() != 0 ||
message->nested_type_count() != 0 || message->enum_type_count() != 0 ||
// Must contain exactly two fields
message->field_count() != 2 ||
// Field name and message name must match
message->name() != ToCamelCase(field->name(), false) + "Entry" ||
// Entry message must be in the same containing type of the field.
field->containing_type() != message->containing_type()) {
return false;
}
const FieldDescriptor* key = message->map_key();
const FieldDescriptor* value = message->map_value();
if (key->label() != FieldDescriptor::LABEL_OPTIONAL || key->number() != 1 ||
key->name() != "key") {
return false;
}
if (value->label() != FieldDescriptor::LABEL_OPTIONAL ||
value->number() != 2 || value->name() != "value") {
return false;
}
// Check key types are legal.
switch (key->type()) {
case FieldDescriptor::TYPE_ENUM:
AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
"Key in map fields cannot be enum types.");
break;
case FieldDescriptor::TYPE_FLOAT:
case FieldDescriptor::TYPE_DOUBLE:
case FieldDescriptor::TYPE_MESSAGE:
case FieldDescriptor::TYPE_GROUP:
case FieldDescriptor::TYPE_BYTES:
AddError(
field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
"Key in map fields cannot be float/double, bytes or message types.");
break;
case FieldDescriptor::TYPE_BOOL:
case FieldDescriptor::TYPE_INT32:
case FieldDescriptor::TYPE_INT64:
case FieldDescriptor::TYPE_SINT32:
case FieldDescriptor::TYPE_SINT64:
case FieldDescriptor::TYPE_STRING:
case FieldDescriptor::TYPE_UINT32:
case FieldDescriptor::TYPE_UINT64:
case FieldDescriptor::TYPE_FIXED32:
case FieldDescriptor::TYPE_FIXED64:
case FieldDescriptor::TYPE_SFIXED32:
case FieldDescriptor::TYPE_SFIXED64:
// Legal cases
break;
// Do not add a default, so that the compiler will complain when new types
// are added.
}
if (value->type() == FieldDescriptor::TYPE_ENUM) {
if (value->enum_type()->value(0)->number() != 0) {
AddError(field->full_name(), proto, DescriptorPool::ErrorCollector::TYPE,
"Enum value in map must define 0 as the first value.");
}
}
return true;
}