@@ -159,8 +159,6 @@ public final class Descriptor {
159159 public private( set) weak var file : FileDescriptor !
160160 public private( set) weak var containingType : Descriptor ?
161161
162- public let isMapEntry : Bool
163-
164162 public let enums : [ EnumDescriptor ]
165163 public let messages : [ Descriptor ]
166164 public let fields : [ FieldDescriptor ]
@@ -179,6 +177,17 @@ public final class Descriptor {
179177 return proto. extensionRange
180178 }
181179
180+ /// True/False if this Message is just for a `map<>` entry.
181+ public var isMapEntry : Bool { return proto. options. mapEntry }
182+
183+ /// Returns the `FieldDescriptor`s for the "key" and "value" fields. If
184+ /// this isn't a map entry field, returns nil.
185+ public var mapKeyAndValue : ( key: FieldDescriptor , value: FieldDescriptor ) ? {
186+ guard isMapEntry else { return nil }
187+ assert ( fields. count == 2 )
188+ return ( key: fields [ 0 ] , value: fields [ 1 ] )
189+ }
190+
182191 public var useMessageSetWireFormat : Bool { return proto. options. messageSetWireFormat }
183192
184193 fileprivate init ( proto: Google_Protobuf_DescriptorProto ,
@@ -190,8 +199,6 @@ public final class Descriptor {
190199 let fullName = " \( prefix) . \( proto. name) "
191200 self . fullName = fullName
192201
193- isMapEntry = proto. options. mapEntry
194-
195202 self . enums = proto. enumType. enumeratedMap {
196203 return EnumDescriptor ( proto: $1, index: $0, registry: registry, fullNamePrefix: fullName)
197204 }
0 commit comments