|
|
@@ -1,39 +1,25 @@
|
|
|
package name.tflucke.webroutes
|
|
|
|
|
|
-import sbt._
|
|
|
-import Keys._
|
|
|
+import sbt.{File,IO}
|
|
|
|
|
|
-object WebRoutes extends AutoPlugin {
|
|
|
- val routePattern = ("\\s*#\\s*Shared\\s+Route\\s*\n" +
|
|
|
+object RouteGenerator {
|
|
|
+ val routeStartPattern = raw"\s*#\s*Shared\s+Route\s*"
|
|
|
+ val propPattern = raw"\s*#\s*\w+\s*:\s*[^\s]+\s*"
|
|
|
+ val routePattern = raw"\s*(GET|PUT|POST|DELETE)\s+(/[^\s]*)+\s+@?([\.\w]+.controllers).([\w]+).([\w]+)\s*(\((\w+\s*:\s*\w+\s*)?(,\s*\w+\s*:\s*\w+)?\))?"
|
|
|
+ // TODO: Fix this pattern since it's easier to interpret than the current one
|
|
|
+ //val sharedRoutePattern = s"${routeStartPattern}\n((${propPattern}\n)*)\n${routePattern}\n".r
|
|
|
+
|
|
|
+ val sharedRoutePattern = ("\\s*#\\s*Shared\\s+Route\\s*\n" +
|
|
|
"((\\s*#\\s*\\w+\\s*:\\s*[^\\s]+\\s*\n)*)" +
|
|
|
"\\s*(GET|PUT|POST|DELETE)\\s+(/[^\\s]*)+\\s+@?([\\.\\w]+.controllers).([\\w]+).([\\w]+)\\s*(\\((\\w+\\s*:\\s*\\w+\\s*)?(,\\s*\\w+\\s*:\\s*\\w+)?\\))?").r
|
|
|
|
|
|
- override def requires: Plugins = ScalaJSPlugin && JSDependenciesPlugin
|
|
|
- override def trigger = noTrigger
|
|
|
-
|
|
|
- object autoImport {
|
|
|
- val generateJsRoutes = taskKey[Seq[File]]("Generate scala client routes objects")
|
|
|
-
|
|
|
- lazy val baseWebRouteSettings: Seq[Def.Setting[_]] = Seq(
|
|
|
- generateJsRoutes := {
|
|
|
- println("Generating Scala Web route objects...")
|
|
|
- generateRoutes(generateJsRoutes.inputFileChanges.modified, (Compile / resourceManaged).value)
|
|
|
- }
|
|
|
- )
|
|
|
- }
|
|
|
- import autoImport._
|
|
|
+ def apply(routeFiles: Seq[java.nio.file.Path], outpath: File) = generateRoutes(routeFiles, outpath)
|
|
|
|
|
|
- override lazy val globalSettings = baseWebRouteSettings
|
|
|
-
|
|
|
- override lazy val projectSettings =
|
|
|
- inConfig(Compile)(baseWebRouteSettings) ++
|
|
|
- inConfig(Test)(baseWebRouteSettings)
|
|
|
-
|
|
|
- def generateRoutes(routeFiles: Seq[java.nio.file.Path], outpath: File): Seq[File] {
|
|
|
+ def generateRoutes(routeFiles: Seq[java.nio.file.Path], outpath: File): Seq[File] = {
|
|
|
routeFiles.flatMap((routesFile: java.nio.file.Path) => {
|
|
|
import scala.io.Source
|
|
|
|
|
|
- val routeGroups = (for (route <- routePattern.findAllMatchIn(Source.fromFile(routesFile.toFile).mkString)) yield {
|
|
|
+ val routeGroups = (for (route <- sharedRoutePattern.findAllMatchIn(Source.fromFile(routesFile.toFile).mkString)) yield {
|
|
|
val propPattern = "\\s*#\\s*(\\w+)\\s*:\\s*([^\\s]+)\\s*\n".r
|
|
|
val props = propPattern.findAllMatchIn(route.group(1)).map(m => (m.group(1), m.group(2)))
|
|
|
def getProp(name: String): Option[String] = props.find(_._1.equalsIgnoreCase(name)).map(_._2)
|
|
|
@@ -50,11 +36,14 @@ object WebRoutes extends AutoPlugin {
|
|
|
val outFiles = routeGroups.map(tuple => {
|
|
|
val ((pack, controller), routes) = tuple
|
|
|
val content = s"""package ${pack}
|
|
|
+
|
|
|
+import name.tflucke.webroutes.APIRoute
|
|
|
+
|
|
|
object ${controller} {
|
|
|
${routes.mkString("\n")}
|
|
|
}
|
|
|
"""
|
|
|
- val outFile = makeControllerFile(pack, controller, outpath.value)
|
|
|
+ val outFile = makeControllerFile(pack, controller, outpath)
|
|
|
IO.write(outFile, content)
|
|
|
outFile
|
|
|
}).toSeq
|