Создание источника 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] ...
}
Другие вопросы по тегам