Создание источника Scala из шаблона Twirl
Я знаю, что play-twirl используется для генерации исходников Scala, которые содержат шаблонные функции, которые можно вызывать во время выполнения.
Есть ли способ генерировать произвольные исходные файлы Scala с помощью play-twirl?
Например
Я хотел бы автоматизировать создание некоторых утомительных сигнатур методов, создав такой шаблон, как
SRC / Основной / Гайковерты /Foos.scala.scala
object Foos {
@for(i <- 2 to 22){
def foo@i[@(...)](chain: @(...)) = @(...)
}
}
И иметь исходный файл, сгенерированный SBT, как
src_managed/ Основной / Scala/Foos.scala
object Foos {
def foo2[A1, A2](chain: A1 ~ A2) = chain match { case a1 ~ a2 => (a1, a2) }
def foo3[A1, A2, A3](chain: A1 ~ A2 ~ A3) = ...
....
def foo22[A1, ..., A22] ....
}
Основываясь на некоторых источниках библиотеки Playframework, похоже, что они используют свою собственную структуру шаблонов для создания чего-то подобного, хотя это не кажется автоматизированным.
Итак, чтобы повторить вопрос, возможен ли такой тип настройки с Twirl? Есть ли альтернативный плагин sbt, который бы облегчил подобные вещи?
1 ответ
Если не считать моей собственной логики SBT, Twirl, кажется, не в состоянии сделать то, что я искал.
Я нашел полезную альтернативу в sbt-шаблоне. Используя этот плагин, я могу выполнить именно то, что искал.
SRC / Основной / шаблонный /Foos.scala.template
object Foos {
[2..22#def foo1[[#A1#]](chain: [#A1# ~ ]) = chain match { case [#a1# ~ ] => ([#a1#]) }
#]
}
Расширяется до
мишень / Scala-2.xx/src_managed/ Основной / Foos.scala
object Foos {
def foo2[A1, A2](chain: A1 ~ A2) = chain match { case a1 ~ a2 => (a1, a2) }
def foo3[A1, A2, A3] ...
...
def foo22[A1, ..., A22] ...
}