// Sources/SwiftProtobuf/ExtensibleMessage.swift - Extension support // // Copyright (c) 2014 - 2016 Apple Inc. and the project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See LICENSE.txt for license information: // https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt // // ----------------------------------------------------------------------------- /// /// Additional capabilities needed by messages that allow extensions. /// // ----------------------------------------------------------------------------- // Messages that support extensions implement this protocol @preconcurrency public protocol ExtensibleMessage: Message { var _protobuf_extensionFieldValues: ExtensionFieldValueSet { get set } } extension ExtensibleMessage { public mutating func setExtensionValue(ext: MessageExtension, value: F.ValueType) { _protobuf_extensionFieldValues[ext.fieldNumber] = F(protobufExtension: ext, value: value) } public func getExtensionValue(ext: MessageExtension) -> F.ValueType? { if let fieldValue = _protobuf_extensionFieldValues[ext.fieldNumber] as? F { return fieldValue.value } return nil } public func hasExtensionValue(ext: MessageExtension) -> Bool { _protobuf_extensionFieldValues[ext.fieldNumber] is F } public mutating func clearExtensionValue(ext: MessageExtension) { _protobuf_extensionFieldValues[ext.fieldNumber] = nil } } // Additional specializations for the different types of repeated fields so // setting them to an empty array clears them from the map. extension ExtensibleMessage { public mutating func setExtensionValue( ext: MessageExtension, Self>, value: [T.BaseType] ) { _protobuf_extensionFieldValues[ext.fieldNumber] = value.isEmpty ? nil : RepeatedExtensionField(protobufExtension: ext, value: value) } public mutating func setExtensionValue(ext: MessageExtension, Self>, value: [T.BaseType]) { _protobuf_extensionFieldValues[ext.fieldNumber] = value.isEmpty ? nil : PackedExtensionField(protobufExtension: ext, value: value) } public mutating func setExtensionValue(ext: MessageExtension, Self>, value: [E]) { _protobuf_extensionFieldValues[ext.fieldNumber] = value.isEmpty ? nil : RepeatedEnumExtensionField(protobufExtension: ext, value: value) } public mutating func setExtensionValue(ext: MessageExtension, Self>, value: [E]) { _protobuf_extensionFieldValues[ext.fieldNumber] = value.isEmpty ? nil : PackedEnumExtensionField(protobufExtension: ext, value: value) } public mutating func setExtensionValue(ext: MessageExtension, Self>, value: [M]) { _protobuf_extensionFieldValues[ext.fieldNumber] = value.isEmpty ? nil : RepeatedMessageExtensionField(protobufExtension: ext, value: value) } public mutating func setExtensionValue(ext: MessageExtension, Self>, value: [M]) { _protobuf_extensionFieldValues[ext.fieldNumber] = value.isEmpty ? nil : RepeatedGroupExtensionField(protobufExtension: ext, value: value) } }