diff --git a/backend/js/src/main/scala/aqua/backend/js/JavaScriptCommon.scala b/backend/js/src/main/scala/aqua/backend/js/JavaScriptCommon.scala index 7eebecd1..02d6588a 100644 --- a/backend/js/src/main/scala/aqua/backend/js/JavaScriptCommon.scala +++ b/backend/js/src/main/scala/aqua/backend/js/JavaScriptCommon.scala @@ -18,16 +18,28 @@ object JavaScriptCommon { def callBackExprBody(at: ArrowType, callbackName: String): String = { val arrowArgumentsToCallbackArgumentsList = at.domain.toList.zipWithIndex - .map(_._2) - .map(idx => s"req.args[$idx]") + .map((`type`, idx) => { + val valueFromArg = s"req.args[$idx]" + `type` match { + case OptionType(t) => + s"${valueFromArg}.length === 0 ? null : ${valueFromArg}[0]" + case _ => valueFromArg + } + }) .concat(List("callParams")) .mkString(", ") val callCallbackStatement = s"$callbackName(${arrowArgumentsToCallbackArgumentsList})" val callCallbackStatementAndReturn = - at.res.fold(s"${callCallbackStatement}; resp.result = {}")(_ => - s"resp.result = ${callCallbackStatement}" + at.res.fold(s"${callCallbackStatement}; resp.result = {}")(`type` => + `type` match { + case OptionType(t) => s""" + | var respResult = ${callCallbackStatement}; + | resp.result = respResult === null ? [] : [respResult] + |""".stripMargin + case _ => s"resp.result = ${callCallbackStatement}" + } ) val tetraplets = FuncRes diff --git a/backend/ts/src/main/scala/aqua/backend/ts/TypeScriptCommon.scala b/backend/ts/src/main/scala/aqua/backend/ts/TypeScriptCommon.scala index e95a19c2..084d56fa 100644 --- a/backend/ts/src/main/scala/aqua/backend/ts/TypeScriptCommon.scala +++ b/backend/ts/src/main/scala/aqua/backend/ts/TypeScriptCommon.scala @@ -70,16 +70,27 @@ object TypeScriptCommon { val arrowArgumentsToCallbackArgumentsList = at.domain.toList .zipWithIndex - .map(_._2) - .map(idx => s"req.args[$idx]") + .map((`type`, idx) => { + val valueFromArg = s"req.args[$idx]" + `type` match { + case OptionType(t) => s"${valueFromArg}.length === 0 ? null : ${valueFromArg}[0]" + case _ => valueFromArg + } + }) .concat(List("callParams")) .mkString(", ") val callCallbackStatement = s"$callbackName(${arrowArgumentsToCallbackArgumentsList})" val callCallbackStatementAndReturn = - at.res.fold(s"${callCallbackStatement}; resp.result = {}")(_ => - s"resp.result = ${callCallbackStatement}" + at.res.fold(s"${callCallbackStatement}; resp.result = {}")(`type` => + `type` match { + case OptionType(t) => s""" + | var respResult = ${callCallbackStatement}; + | resp.result = respResult === null ? [] : [respResult] + |""".stripMargin + case _ => s"resp.result = ${callCallbackStatement}" + } ) val tetraplets = FuncRes