From d300d5c16b6e25b7f54e7e1a89369aa7424081d4 Mon Sep 17 00:00:00 2001 From: efim Date: Sat, 23 Sep 2023 09:31:04 +0000 Subject: [PATCH] feat: loading country data from resourse json --- 16-countries-page-from-api/.scalafmt.conf | 2 ++ .../main/resources/temporary}/data.json | 0 .../src/main/scala/example/Country.scala | 27 +++++++++++++++++++ .../src/main/scala/example/Main.scala | 11 +++++++- .../src/main/scala/example/Routes.scala | 8 +++--- 5 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 16-countries-page-from-api/.scalafmt.conf rename 16-countries-page-from-api/{ => src/main/resources/temporary}/data.json (100%) create mode 100644 16-countries-page-from-api/src/main/scala/example/Country.scala diff --git a/16-countries-page-from-api/.scalafmt.conf b/16-countries-page-from-api/.scalafmt.conf new file mode 100644 index 0000000..6418b35 --- /dev/null +++ b/16-countries-page-from-api/.scalafmt.conf @@ -0,0 +1,2 @@ +version = "3.7.10" +runner.dialect = scala3 \ No newline at end of file diff --git a/16-countries-page-from-api/data.json b/16-countries-page-from-api/src/main/resources/temporary/data.json similarity index 100% rename from 16-countries-page-from-api/data.json rename to 16-countries-page-from-api/src/main/resources/temporary/data.json diff --git a/16-countries-page-from-api/src/main/scala/example/Country.scala b/16-countries-page-from-api/src/main/scala/example/Country.scala new file mode 100644 index 0000000..91267ea --- /dev/null +++ b/16-countries-page-from-api/src/main/scala/example/Country.scala @@ -0,0 +1,27 @@ +package example + +import upickle.default._ + +final case class Country( + name: String, + alpha3Code: String, + nativeName: String = "", + population: Int, + region: String, + subregion: String, + capital: String = "", + topLevelDomain: Option[String], // maybe optional? + currencies: List[Currency] = List.empty, + languages: List[Language], + borders: List[String] = List.empty, +) derives ReadWriter + +final case class Currency( + code: String, + name: String +) derives ReadWriter + +final case class Language( + name: String, + nativeName: String = "" +) derives ReadWriter 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 3845726..f6cea77 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 @@ -16,14 +16,23 @@ object MinimalApplication extends cask.Routes{ hostArg: String = "localhost" ) = { println(s"Will start server on ${hostArg}:${portArg}") + val countriesDb = loadCountries() val server = new cask.Main { - override def allRoutes: Seq[cask.main.Routes] = Seq(Routes()) + override def allRoutes: Seq[cask.main.Routes] = Seq(Routes(countries = countriesDb )) override def port: Int = portArg override def host: String = hostArg } server.main(Array.empty) } + def loadCountries() = { + val countries: List[Country] = upickle.default.read[List[Country]]( + scala.io.Source.fromResource("temporary/data.json").getLines().mkString, + true + ) + countries + } + def main(args: Array[String]): Unit = ParserForMethods(this).runOrExit(args) 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 index 3e6d6d0..30fa502 100644 --- a/16-countries-page-from-api/src/main/scala/example/Routes.scala +++ b/16-countries-page-from-api/src/main/scala/example/Routes.scala @@ -6,8 +6,7 @@ import org.thymeleaf.TemplateEngine import org.thymeleaf.context.Context import org.thymeleaf.templatemode.TemplateMode - -case class Routes()(implicit cc: castor.Context, log: cask.Logger) +case class Routes(countries: List[Country])(implicit cc: castor.Context, log: cask.Logger) extends cask.Routes { def buildTemplateEngine(): TemplateEngine = { @@ -27,9 +26,10 @@ case class Routes()(implicit cc: castor.Context, log: cask.Logger) @cask.get("/") def hello() = { val context = new Context() - val yo = engine.process("index", context) + val indexPage = engine.process("index", context) + Response( - yo, + indexPage, headers = Seq("Content-Type" -> "text/html; charset=utf-8") ) }