ExtensibleMessage.swift 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Sources/SwiftProtobuf/ExtensibleMessage.swift - Extension support
  2. //
  3. // Copyright (c) 2014 - 2016 Apple Inc. and the project authors
  4. // Licensed under Apache License v2.0 with Runtime Library Exception
  5. //
  6. // See LICENSE.txt for license information:
  7. // https://github.com/apple/swift-protobuf/blob/main/LICENSE.txt
  8. //
  9. // -----------------------------------------------------------------------------
  10. ///
  11. /// Additional capabilities needed by messages that allow extensions.
  12. ///
  13. // -----------------------------------------------------------------------------
  14. // Messages that support extensions implement this protocol
  15. @preconcurrency
  16. public protocol ExtensibleMessage: Message {
  17. var _protobuf_extensionFieldValues: ExtensionFieldValueSet { get set }
  18. }
  19. extension ExtensibleMessage {
  20. public mutating func setExtensionValue<F: ExtensionField>(ext: MessageExtension<F, Self>, value: F.ValueType) {
  21. _protobuf_extensionFieldValues[ext.fieldNumber] = F(protobufExtension: ext, value: value)
  22. }
  23. public func getExtensionValue<F: ExtensionField>(ext: MessageExtension<F, Self>) -> F.ValueType? {
  24. if let fieldValue = _protobuf_extensionFieldValues[ext.fieldNumber] as? F {
  25. return fieldValue.value
  26. }
  27. return nil
  28. }
  29. public func hasExtensionValue<F: ExtensionField>(ext: MessageExtension<F, Self>) -> Bool {
  30. _protobuf_extensionFieldValues[ext.fieldNumber] is F
  31. }
  32. public mutating func clearExtensionValue<F: ExtensionField>(ext: MessageExtension<F, Self>) {
  33. _protobuf_extensionFieldValues[ext.fieldNumber] = nil
  34. }
  35. }
  36. // Additional specializations for the different types of repeated fields so
  37. // setting them to an empty array clears them from the map.
  38. extension ExtensibleMessage {
  39. public mutating func setExtensionValue<T>(
  40. ext: MessageExtension<RepeatedExtensionField<T>, Self>,
  41. value: [T.BaseType]
  42. ) {
  43. _protobuf_extensionFieldValues[ext.fieldNumber] =
  44. value.isEmpty ? nil : RepeatedExtensionField<T>(protobufExtension: ext, value: value)
  45. }
  46. public mutating func setExtensionValue<T>(ext: MessageExtension<PackedExtensionField<T>, Self>, value: [T.BaseType])
  47. {
  48. _protobuf_extensionFieldValues[ext.fieldNumber] =
  49. value.isEmpty ? nil : PackedExtensionField<T>(protobufExtension: ext, value: value)
  50. }
  51. public mutating func setExtensionValue<E>(ext: MessageExtension<RepeatedEnumExtensionField<E>, Self>, value: [E]) {
  52. _protobuf_extensionFieldValues[ext.fieldNumber] =
  53. value.isEmpty ? nil : RepeatedEnumExtensionField<E>(protobufExtension: ext, value: value)
  54. }
  55. public mutating func setExtensionValue<E>(ext: MessageExtension<PackedEnumExtensionField<E>, Self>, value: [E]) {
  56. _protobuf_extensionFieldValues[ext.fieldNumber] =
  57. value.isEmpty ? nil : PackedEnumExtensionField<E>(protobufExtension: ext, value: value)
  58. }
  59. public mutating func setExtensionValue<M>(ext: MessageExtension<RepeatedMessageExtensionField<M>, Self>, value: [M])
  60. {
  61. _protobuf_extensionFieldValues[ext.fieldNumber] =
  62. value.isEmpty ? nil : RepeatedMessageExtensionField<M>(protobufExtension: ext, value: value)
  63. }
  64. public mutating func setExtensionValue<M>(ext: MessageExtension<RepeatedGroupExtensionField<M>, Self>, value: [M]) {
  65. _protobuf_extensionFieldValues[ext.fieldNumber] =
  66. value.isEmpty ? nil : RepeatedGroupExtensionField<M>(protobufExtension: ext, value: value)
  67. }
  68. }