diff --git a/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/HttpClientIR.scala b/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/HttpClientIR.scala index ae66284c2..c6502a189 100644 --- a/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/HttpClientIR.scala +++ b/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/HttpClientIR.scala @@ -184,6 +184,17 @@ object HttpClientIR extends LogSupport { ) .map(arg => HttpClientGenerator.fullTypeNameOf(arg)) .mkString(", ") + + def rpcReturnElementType: Surface = { + val isRxResponse = returnType.rawType.isAssignableFrom(classOf[Rx[_]]) && returnType.typeArgs.size == 1 + if (isRxResponse) { + // for methods returning Rx[A], extract A + returnType.typeArgs(0) + } else { + returnType + } + } + def clientMethodName = { val methodName = httpMethod.toString.toLowerCase(Locale.ENGLISH) if (isOpsRequest) s"${methodName}Ops" diff --git a/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/client/RPCClientGenerator.scala b/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/client/RPCClientGenerator.scala index 647806833..453a506a3 100644 --- a/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/client/RPCClientGenerator.scala +++ b/airframe-http-codegen/src/main/scala/wvlet/airframe/http/codegen/client/RPCClientGenerator.scala @@ -17,6 +17,7 @@ import wvlet.airframe.http.codegen.HttpClientIR import wvlet.airframe.http.codegen.HttpClientIR.{ClientMethodDef, ClientServiceDef} import wvlet.airframe.http.codegen.client.HttpClientGenerator.RichSurface import wvlet.airframe.rx.Rx +import wvlet.airframe.surface.Surface /** * The default RPC client generator using Http.client.Sync/AsyncClient @@ -71,7 +72,7 @@ object RPCClientGenerator extends HttpClientGenerator { def rpcMethodDefs(svc: ClientServiceDef): String = { svc.methods .map { m => - s"""lazy val __m_${m.name} = RPCMethod("${m.path}", "${svc.interfaceName}", "${m.name}", Surface.of[${m.requestModelClassType}], Surface.of[${m.returnType.fullTypeName}])""" + s"""lazy val __m_${m.name} = RPCMethod("${m.path}", "${svc.interfaceName}", "${m.name}", Surface.of[${m.requestModelClassType}], Surface.of[${m.rpcReturnElementType.fullTypeName}])""" }.mkString("\n") } @@ -142,13 +143,7 @@ object RPCClientGenerator extends HttpClientGenerator { m.inputParameters .map(x => s"${x.name}: ${x.surface.fullTypeName}") - val isRxResponse = m.returnType.rawType.isAssignableFrom(classOf[Rx[_]]) && m.returnType.typeArgs.size == 1 - val returnElementType = if (isRxResponse) { - // for methods returning Rx[A], extract A - m.returnType.typeArgs(0).fullTypeName - } else { - m.returnType.fullTypeName - } + val returnElementType = m.rpcReturnElementType.fullTypeName val returnType = if (isAsync) s"Rx[${returnElementType}]"