forked from lichess-org/lila
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRoutesCompiler.scala
97 lines (78 loc) · 3.46 KB
/
RoutesCompiler.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import play.routes.compiler._
import play.routes.compiler.RoutesCompiler.RoutesCompilerTask
import java.io.File
object LilaRoutesGenerator extends RoutesGenerator {
val ForwardsRoutesFile = "Routes.scala"
val ReverseRoutesFile = "ReverseRoutes.scala"
val RoutesPrefixFile = "RoutesPrefix.scala"
val JavaWrapperFile = "routes.java"
val id = "lila"
def generate(task: RoutesCompilerTask, namespace: Option[String], rules: List[Rule]): Seq[(String, String)] = {
val folder = namespace.map(_.replace('.', '/') + "/").getOrElse("") + "/"
val sourceInfo = RoutesSourceInfo(task.file.getCanonicalPath.replace(File.separator, "/"), new java.util.Date().toString)
val routes = rules.collect { case r: Route => r }
val forwardsRoutesFiles = if (task.forwardsRouter) {
Seq(folder + ForwardsRoutesFile -> generateRouter(sourceInfo, namespace, task.additionalImports, rules))
} else {
Nil
}
val reverseRoutesFiles = if (task.reverseRouter) {
Seq(folder + RoutesPrefixFile -> generateRoutesPrefix(sourceInfo, namespace)) ++
generateReverseRouters(sourceInfo, namespace, task.additionalImports, routes, task.namespaceReverseRouter) ++
generateJavaWrappers(sourceInfo, namespace, rules, task.namespaceReverseRouter)
} else {
Nil
}
forwardsRoutesFiles ++ reverseRoutesFiles
}
private def generateRouter(sourceInfo: RoutesSourceInfo, namespace: Option[String], additionalImports: Seq[String], rules: List[Rule]) =
static.twirl.forwardsRouter(
sourceInfo,
namespace,
additionalImports,
rules
).body
private def generateRoutesPrefix(sourceInfo: RoutesSourceInfo, namespace: Option[String]) =
static.twirl.routesPrefix(
sourceInfo,
namespace,
_.call.instantiate
).body
private def generateReverseRouters(sourceInfo: RoutesSourceInfo, namespace: Option[String], additionalImports: Seq[String], routes: List[Route], namespaceReverseRouter: Boolean) = {
routes.groupBy(_.call.packageName).map {
case (pn, routes) =>
val packageName = namespace.filter(_ => namespaceReverseRouter).map(_ + "." + pn).getOrElse(pn)
(packageName.replace(".", "/") + "/" + ReverseRoutesFile) ->
static.twirl.reverseRouter(
sourceInfo,
namespace,
additionalImports,
packageName,
routes,
namespaceReverseRouter,
_.call.instantiate
).body
}
}
private def generateJavaWrappers(sourceInfo: RoutesSourceInfo, namespace: Option[String], rules: List[Rule], namespaceReverseRouter: Boolean) = {
rules.collect { case r: Route => r }.groupBy(_.call.packageName).map {
case (pn, routes) =>
val packageName = namespace.filter(_ => namespaceReverseRouter).map(_ + "." + pn).getOrElse(pn)
val controllers = routes.groupBy(_.call.controller).keys.toSeq
(packageName.replace(".", "/") + "/" + JavaWrapperFile) ->
renderJavaWrappers(sourceInfo, namespace, packageName, controllers)
}
}
private def renderJavaWrappers(
sourceInfo: RoutesSourceInfo,
pkg: Option[String],
packageName: String,
controllers: Seq[String]) = s"""package $packageName;
import ${pkg getOrElse "_routes_"}.RoutesPrefix;
public class routes {
""" + controllers.map { controller =>
s"""public static final ${packageName}.Reverse${controller} ${controller} = new ${packageName}.Reverse${controller}(RoutesPrefix.byNamePrefix());
"""
}.mkString + """
}"""
}