Привет, поэтому я пытался создать некоторые общие функции, используя макросы и Quill.
Вот моя реализация макроса:
class Impl(val c: Context) {
import c.universe._
def all[T](tblName: Tree, ctx: Tree)(implicit t: WeakTypeTag[T]): Tree =
q"""
import ${ctx}._
implicit val schema = schemaMeta[$t](${tblName})
run(quote {
query[$t]
})
"""
}
object Macros {
def all[T](tblName: String, ctx: MysqlAsyncContext[Literal.type]): Future[List[T]] = macro Impl.all[T]
}
И я попробовал использовать его в следующем коде:
case class Language(id: Short, iso639_1: String, name: String)
object Language {
val tableName = "Languages"
def all()(implicit mysql: MysqlAsyncContext[Literal.type], ec: ExecutionContext): Future[List[Language]] =
Macros.all[Language](tableName, mysql)
}
Но тогда я получаю следующую ошибку:
Language.scala:99:25: type mismatch;
[error] found : mysql.Quoted[mysql.EntityQuery[Language]]{def quoted: io.getquill.ast.Entity; def ast: io.getquill.ast.Entity; def id1101286793(): Unit; val liftings: Object}
[error] required: io.getquill.MysqlAsyncContext[io.getquill.Literal.type]#EntityQuery[com.github.pokeboston.libghpagesapi.normalized.Language]
[error] Macros.all[Language]("Languages", mysql)
[error] ^
Однако я знаю, что передаваемый в макрос ctx действительно является MysqlAsyncContext, потому что когда я изменяю код макроса на:
class Impl(val c: Context) {
import c.universe._
def all[T](tblName: Tree, ctx: Tree)(implicit t: WeakTypeTag[T]): Tree =
q"""
import ${ctx}._
implicit val schema = schemaMeta[$t](${tblName})
$ctx
"""
}
Это дает мне следующую ошибку:
Language.scala:99:25: type mismatch;
[error] found : io.getquill.MysqlAsyncContext[io.getquill.Literal.type]
[error] required: scala.concurrent.Future[List[Language]]
[error] Macros.all[Language]("Languages", mysql)
[error] ^
Я предполагаю, что в макросах есть что-то, что я в корне неправильно понимаю. Любое просветление будет высоко ценится!
Спасибо!