func renderFuncSwitchCase()

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("}")
        }
    }