I have a dispatching method which is auto-generated by SwiftProtobuf:
/// Parses message by concrete data by method name and it's data.
/// Throws `HandleMethodError.unknownMethod` for methods not handled by this service.
public func parseMessage(from method: String, with data: Data) throws -> Message {
switch method {
case "transfer_signaling.TransferSignaling.CreateUpload":
return try TransferSignaling_CreateUploadRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.ResumeUpload":
return try TransferSignaling_ResumeUploadRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.CancelUpload":
return try TransferSignaling_CancelUploadRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.TriggerUploadAction":
return try TransferSignaling_UploadActionTriggerRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.CreateDownload":
return try TransferSignaling_CreateDownloadRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.StartDownload":
return try TransferSignaling_StartDownloadRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.ResumeDownload":
return try TransferSignaling_ResumeDownloadRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.CancelDownload":
return try TransferSignaling_CancelDownloadRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.DeleteFiles":
return try TransferSignaling_DeleteFilesRequest(serializedData: data)
case "transfer_signaling.TransferSignaling.reportDownloadProgress":
return try TransferSignaling_TransferProgressReport(serializedData: data)
case "transfer_signaling.TransferSignaling.reportDownloadEnded":
return try TransferSignaling_DownloadEndedReport(serializedData: data)
case "transfer_signaling.TransferSignaling.registerEventOnDownloadTrigger":
return try Common_Empty(serializedData: data)
case "transfer_signaling.TransferSignaling.registerEventOnCancelTrigger":
return try Common_Empty(serializedData: data)
case "transfer_signaling.TransferSignaling.registerEventOnUploadProgressReport":
return try Common_Empty(serializedData: data)
default:
throw HandleMethodError.unknownMethod
}
}
When invoked with a string of "transfer_signaling.TransferSignaling.CreateDownload"
it consistently hits the default
case.
I am using Xcode 13.2.1, and I am making use of Swift Concurrency. I have tried different optimization levels. Other strings (method invocations) work.
I have also tried the following handwritten implementation and it works no better:
/// Parses message by concrete data by method name and it's data.
/// Throws `HandleMethodError.unknownMethod` for methods not handled by this service.
public func parseMessage(from method: String, with data: Data) throws -> Message {
let map: [String: () throws -> Message] = [
"transfer_signaling.TransferSignaling.CreateUpload": {try TransferSignaling_CreateUploadRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.ResumeUpload": {try TransferSignaling_ResumeUploadRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.CancelUpload": {try TransferSignaling_CancelUploadRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.TriggerUploadAction": {try TransferSignaling_UploadActionTriggerRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.CreateDownload": {try TransferSignaling_CreateDownloadRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.StartDownload": {try TransferSignaling_StartDownloadRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.ResumeDownload": {try TransferSignaling_ResumeDownloadRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.CancelDownload": {try TransferSignaling_CancelDownloadRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.DeleteFiles": {try TransferSignaling_DeleteFilesRequest(serializedData: data)},
"transfer_signaling.TransferSignaling.reportDownloadProgress": {try TransferSignaling_TransferProgressReport(serializedData: data)},
"transfer_signaling.TransferSignaling.reportDownloadEnded": {try TransferSignaling_DownloadEndedReport(serializedData: data)},
"transfer_signaling.TransferSignaling.registerEventOnDownloadTrigger": {try Common_Empty(serializedData: data)},
"transfer_signaling.TransferSignaling.registerEventOnCancelTrigger": {try Common_Empty(serializedData: data)},
"transfer_signaling.TransferSignaling.registerEventOnUploadProgressReport": {try Common_Empty(serializedData: data)},
]
guard let block = map[method] else {
throw HandleMethodError.unknownMethod
}
return try block()
}
The string is not found in the map. This exact same code works in other projects, and in fact works with an earlier commit of the same project.