@@ -196,7 +196,7 @@ class MessageGenerator {
196
196
func generateRuntimeSupport( printer p: inout CodePrinter , file: FileGenerator , parent: MessageGenerator ? ) {
197
197
p. print (
198
198
" " ,
199
- " extension \( swiftFullName) : \( namer. swiftProtobufModulePrefix) Message, \( namer. swiftProtobufModulePrefix) _MessageImplementationBase, \( namer. swiftProtobufModulePrefix) _ProtoNameProviding { " )
199
+ " extension \( swiftFullName) : \( namer. swiftProtobufModulePrefix) Message, \( namer. swiftProtobufModulePrefix) _MessageImplementationBase, \( namer. swiftProtobufModulePrefix) _ProtoNameProviding, \( namer . swiftProtobufModulePrefix ) MessageModifier {" )
200
200
p. withIndentation { p in
201
201
if let parent = parent {
202
202
p. print ( " \( visibility) static let protoMessageName: String = \( parent. swiftFullName) .protoMessageName + \" . \( descriptor. name) \" " )
@@ -220,6 +220,8 @@ class MessageGenerator {
220
220
generateTraverse ( printer: & p)
221
221
p. print ( )
222
222
generateMessageEquality ( printer: & p)
223
+ p. print ( )
224
+ generateMessageApplying ( printer: & p)
223
225
}
224
226
p. print ( " } " )
225
227
@@ -402,6 +404,29 @@ class MessageGenerator {
402
404
p. print ( " } " )
403
405
}
404
406
407
+ private func generateMessageApplying( printer p: inout CodePrinter ) {
408
+ p. print ( " \( visibility) func applying(_ value: Any, for fieldNumber: Int) throws -> \( swiftFullName) { " )
409
+ p. withIndentation { p in
410
+ p. print ( """
411
+ func valueAs<T>(_ type: T.Type) throws -> T {
412
+ guard let _value = value as? T else {
413
+ throw \( namer. swiftProtobufModulePrefix) MessageModificationError.typeMismatch
414
+ }
415
+ return _value
416
+ }
417
+ """ )
418
+ p. print ( " var copy = self " )
419
+ p. print ( " switch fieldNumber { " )
420
+ for f in fields {
421
+ f. generateApplying ( printer: & p)
422
+ }
423
+ p. print ( " default: throw \( namer. swiftProtobufModulePrefix) MessageModificationError.invalidFieldNumber " )
424
+ p. print ( " } " )
425
+ p. print ( " return copy " )
426
+ }
427
+ p. print ( " } " )
428
+ }
429
+
405
430
/// Generates the `isInitialized` property for the message, if needed.
406
431
///
407
432
/// This may generate nothing, if the `isInitialized` property is not
0 commit comments