Coverage Summary for Class: RpcRequestKt (io.actrium.actr.dsl)

Class Method, % Branch, % Line, % Instruction, %
RpcRequestKt 0% (0/2) 0% (0/9) 0% (0/100)
RpcRequestKt$call$1
RpcRequestKt$call$2
Total 0% (0/2) 0% (0/9) 0% (0/100)


 /**
  * Type-safe RPC protocol for compile-time checked request/response pairs.
  *
  * ## Usage
  *
  * ```kotlin
  * // 1. Define your RPC contract
  * object EchoRpc : RpcRequest<EchoRequest, EchoResponse> {
  *     override val routeKey = "echo.EchoService.Echo"
  *     override fun serializeRequest(request: EchoRequest) = request.toByteArray()
  *     override fun deserializeResponse(bytes: ByteArray) = EchoResponse.parseFrom(bytes)
  * }
  *
  * // 2. Call with type safety
  * val response: EchoResponse = ref.call(EchoRpc, EchoRequest.newBuilder().setMessage("hello").build())
  * ```
  *
  * ### With lambdas (inline, no object needed)
  *
  * ```kotlin
  * val response = ref.call(
  *     "echo.EchoService.Echo",
  *     request = EchoRequest.newBuilder().setMessage("hello").build(),
  *     serialize = { it.toByteArray() },
  *     deserialize = { EchoResponse.parseFrom(it) },
  * )
  * ```
  */
 package io.actrium.actr.dsl
 
 import io.actrium.actr.PayloadType
 
 /**
  * Type-safe RPC contract that binds a request type to its response type and route.
  *
  * Implement this interface once per RPC method to get compile-time type safety
  * when calling remote actors.
  *
  * @param Req The request message type
  * @param Resp The response message type
  */
 interface RpcRequest<Req, Resp> {
     /** RPC route key, e.g., "echo.EchoService.Echo". */
     val routeKey: String
 
     /** Serialize the request message to bytes. */
     fun serializeRequest(request: Req): ByteArray
 
     /** Deserialize the response message from bytes. */
     fun deserializeResponse(bytes: ByteArray): Resp
 }
 
 /**
  * Perform a type-safe RPC call using an [RpcRequest] contract.
  *
  * Example:
  * ```kotlin
  * val response: EchoResponse = ref.call(EchoRpc, EchoRequest.newBuilder().setMessage("hello").build())
  * ```
  *
  * @param rpc The RPC contract defining route, serialization, and deserialization
  * @param request The request message
  * @param payloadType Transmission type (default: RPC_RELIABLE)
  * @param timeoutMs Timeout in milliseconds (default: 30000)
  * @return The deserialized response
  */
 suspend fun <Req, Resp> ActrRef.call(
     rpc: RpcRequest<Req, Resp>,
     request: Req,
     payloadType: PayloadType = PayloadType.RPC_RELIABLE,
     timeoutMs: Long = 30000L,
 ): Resp {
     val responseBytes = call(rpc.routeKey, payloadType, rpc.serializeRequest(request), timeoutMs)
     return rpc.deserializeResponse(responseBytes)
 }
 
 /**
  * Perform an inline type-safe RPC call with lambda-based serialization.
  *
  * This overload is useful when you don't want to define a separate [RpcRequest]
  * object — just pass the serialization lambdas inline.
  *
  * Example:
  * ```kotlin
  * val response = ref.call(
  *     "echo.EchoService.Echo",
  *     request = EchoRequest.newBuilder().setMessage("hello").build(),
  *     serialize = { it.toByteArray() },
  *     deserialize = { EchoResponse.parseFrom(it) },
  * )
  * ```
  *
  * @param routeKey RPC route key
  * @param request The request message
  * @param payloadType Transmission type (default: RPC_RELIABLE)
  * @param timeoutMs Timeout in milliseconds (default: 30000)
  * @param serialize Function to serialize the request to bytes
  * @param deserialize Function to deserialize the response from bytes
  * @return The deserialized response
  */
 suspend inline fun <Req, Resp> ActrRef.call(
     routeKey: String,
     request: Req,
     payloadType: PayloadType = PayloadType.RPC_RELIABLE,
     timeoutMs: Long = 30000L,
     crossinline serialize: (Req) -> ByteArray,
     crossinline deserialize: (ByteArray) -> Resp,
 ): Resp {
     val responseBytes = call(routeKey, payloadType, serialize(request), timeoutMs)
     return deserialize(responseBytes)
 }