in Sources/DistributedActorsGenerator/Decls+GenActorRendering.swift [726:816]
func renderFuncSwitchCase(partOfProtocol ownerProtocol: DistributedActorDecl?, printer: inout CodePrinter) throws {
printer.print("case ", skipNewline: true)
if let boxProto = ownerProtocol {
printer.print(".\(boxProto.nameFirstLowercased)(", skipNewline: true)
}
printer.print(".\(message.name)\(message.renderCaseLetParams)", skipNewline: true)
if ownerProtocol != nil {
printer.print(")", skipNewline: true)
}
printer.print(":")
printer.indent()
/// since we invoke a distributed func (even though we know it is local)
/// the function is always throwing so we wrap it in a do/catch:
if self.message.returnType.rendersReturn {
printer.print("do {")
printer.indent()
}
// render invocation
if self.message.returnType.isVoid {
printer.print("let result = _Done.done")
} else {
printer.print("let result = ", skipNewline: true)
}
printer.print(self.message.returnIfBecome, skipNewline: true)
printer.dontIndentNext()
printer.print("try await ", skipNewline: true)
printer.print("instance.\(self.message.name)(\(CodePrinter.content(self.message.passParams)))")
if self.message.effectivelyThrowing {
printer.print("_replyTo.tell(.success(result))")
} else {
printer.print("_replyTo.tell(result)")
}
switch self.message.returnType {
case .nioEventLoopFuture:
printer.indent()
printer.print(".whenComplete { res in")
printer.indent()
printer.print("switch res {")
printer.print("case .success(let value):")
printer.indent()
printer.print("_replyTo.tell(.success(value))")
printer.outdent()
printer.print("case .failure(let error):")
printer.indent()
printer.print("_replyTo.tell(.failure(ErrorEnvelope(error)))")
printer.outdent()
printer.print("}")
printer.outdent()
printer.print("}")
printer.outdent()
case .actorReply, .askResponse:
printer.indent()
printer.print("._onComplete { res in")
printer.indent()
printer.print("switch res {")
printer.print("case .success(let value):")
printer.indent()
printer.print("_replyTo.tell(.success(value))")
printer.outdent()
printer.print("case .failure(let error):")
printer.indent()
printer.print("_replyTo.tell(.failure(ErrorEnvelope(error)))")
printer.outdent()
printer.print("}")
printer.outdent()
printer.print("}")
printer.outdent()
case .result:
printer.print("_replyTo.tell(result.mapError { error in ErrorEnvelope(error) })")
default:
printer.print("")
}
if self.message.returnType.rendersReturn {
printer.outdent()
printer.print("} catch {")
printer.indent()
printer.print("context.log.warning(\"Error thrown while handling [\\(message)], error: \\(error)\")")
printer.print("_replyTo.tell(.failure(ErrorEnvelope(error)))")
printer.outdent()
printer.print("}")
}
}