diff --git a/16-countries-page-from-api/build.sbt b/16-countries-page-from-api/build.sbt index 33cf94a..1abc582 100644 --- a/16-countries-page-from-api/build.sbt +++ b/16-countries-page-from-api/build.sbt @@ -4,9 +4,11 @@ val toolkit = "org.scala-lang" %% "toolkit" % toolkitV val toolkitTest = "org.scala-lang" %% "toolkit-test" % toolkitV val cask = "com.lihaoyi" %% "cask" % "0.9.1" +val mainargs = "com.lihaoyi" %% "mainargs" % "0.5.4" ThisBuild / scalaVersion := "3.2.2" libraryDependencies += cask +libraryDependencies += mainargs libraryDependencies += toolkit libraryDependencies += (toolkitTest % Test) diff --git a/16-countries-page-from-api/src/main/scala/example/Main.scala b/16-countries-page-from-api/src/main/scala/example/Main.scala index 557d064..3845726 100644 --- a/16-countries-page-from-api/src/main/scala/example/Main.scala +++ b/16-countries-page-from-api/src/main/scala/example/Main.scala @@ -4,40 +4,27 @@ import org.thymeleaf.templatemode.TemplateMode import org.thymeleaf.TemplateEngine import org.thymeleaf.context.Context import cask.model.Response -object MinimalApplication extends cask.MainRoutes{ - @cask.get("/") - def hello() = { - val context = new Context() - val yo = engine.process("lala", context) - Response( - yo, - headers = Seq("Content-Type" -> "text/html; charset=utf-8") - ) +import mainargs.{main, arg, ParserForMethods, Flag} + +object MinimalApplication extends cask.Routes{ + + @main + def run( + @arg(name="port", short='p', doc="Port on which server will start service") + portArg: Int = 8080, + @arg(name="host", doc="Host on which server will start serving") + hostArg: String = "localhost" + ) = { + println(s"Will start server on ${hostArg}:${portArg}") + val server = new cask.Main { + override def allRoutes: Seq[cask.main.Routes] = Seq(Routes()) + override def port: Int = portArg + override def host: String = hostArg + } + server.main(Array.empty) } - @cask.post("/do-thing") - def doThing(request: cask.Request) = { - request.text().reverse - } + def main(args: Array[String]): Unit = ParserForMethods(this).runOrExit(args) - @cask.staticResources("public") - def giveStaticResources() = "public" - initialize() - - def buildTemplateEngine(): TemplateEngine = { - import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver - val templateResolver = new ClassLoaderTemplateResolver() - templateResolver.setTemplateMode(TemplateMode.HTML) - templateResolver.setPrefix("/templates/") - templateResolver.setSuffix(".html") - templateResolver.setCacheTTLMs(3600000L); - - val templateEngine = new TemplateEngine() - templateEngine.setTemplateResolver(templateResolver) - - templateEngine - } - - val engine: TemplateEngine = buildTemplateEngine() } diff --git a/16-countries-page-from-api/src/main/scala/example/Routes.scala b/16-countries-page-from-api/src/main/scala/example/Routes.scala new file mode 100644 index 0000000..c38db11 --- /dev/null +++ b/16-countries-page-from-api/src/main/scala/example/Routes.scala @@ -0,0 +1,47 @@ +package example + +import cask.model.Response +import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver +import org.thymeleaf.TemplateEngine +import org.thymeleaf.context.Context +import org.thymeleaf.templatemode.TemplateMode + + +case class Routes()(implicit cc: castor.Context, log: cask.Logger) + extends cask.Routes { + + def buildTemplateEngine(): TemplateEngine = { + val templateResolver = new ClassLoaderTemplateResolver() + templateResolver.setTemplateMode(TemplateMode.HTML) + templateResolver.setPrefix("/templates/") + templateResolver.setSuffix(".html") + templateResolver.setCacheTTLMs(3600000L); + + val templateEngine = new TemplateEngine() + templateEngine.setTemplateResolver(templateResolver) + + templateEngine + } + val engine: TemplateEngine = buildTemplateEngine() + + @cask.get("/") + def hello() = { + val context = new Context() + val yo = engine.process("lala", context) + Response( + yo, + headers = Seq("Content-Type" -> "text/html; charset=utf-8") + ) + } + + @cask.post("/do-thing") + def doThing(request: cask.Request) = { + request.text().reverse + } + + @cask.staticResources("public") + def giveStaticResources() = "public" + + initialize() + +}