У меня есть конфиг sbt с scala play! сервер, scalajs клиент и общий проект, который содержит классы, которые передаются между ними.
Я хочу, чтобы мой клиент имел строгую информацию о типах для вызовов API сервера, поэтому я пишу задача, которая для каждого маршрута в файле routes
создает соответствующий метод в клиенте. У меня есть прототип, который способен анализировать почти всю необходимую мне информацию из файла routes
. Единственное, что я не могу получить, это возвращаемые типы.
Вот что у меня есть до сих пор (я понимаю, что это не обрабатывает все, но работает для всех базовых c случаев, с которыми я работаю прямо сейчас):
case class RouteDef(
method: String,
url: String,
pack: String,
controller: String,
fn: String,
args: Option[Array[String]],
retType: String = "Array[Byte]",
retFormat: String = "application/json"
) {
def interpolatedUrl: String = {
":(?<symbol>[^/]+)".r.replaceAllIn(url, (matc) => "\\${${symbol}}")
}
override def toString: String = {
s""" import play.api.libs.json.{Json,Reads}
import org.scalajs.dom.ext.Ajax.InputData
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.util.Try
import org.scalajs.dom.XMLHttpRequest
import org.scalajs.dom.ext.Ajax
def ${fn}(${args match {
case Some(a) => a.mkString(", ") + ","
case None => ""
}} timeout: Int = 0, headers: Map[String, String] = Map.empty, withCredentials: Boolean = false) : Future[${retType}] = {
Ajax(\"${method}\", \"${interpolatedUrl}\", null, timeout, headers, withCredentials, \"${retFormat}\").transform(
(x: Try[XMLHttpRequest]) => Try(Json.parse(x.get.responseText).as[${retType}])
)
}
"""
}
}
Я думал о добавлении аннотации к каждому из моих вызовов методов, но тогда у меня нет хорошего способа разобрать их. Я попытался использовать scalac -Xshow-class
, но он не отображает типы или аннотации.
Я думал о попытке проанализировать файл класса вручную, но, похоже, я столкнулся с множеством угловых случаев, которые приводили бы к это сильная головная боль.
Есть ли хороший способ перевести полный путь к определению метода, чтобы получить аннотации этого метода?