diff --git a/16-countries-page-from-api/build.sbt b/16-countries-page-from-api/build.sbt index 4541846..9015c9e 100644 --- a/16-countries-page-from-api/build.sbt +++ b/16-countries-page-from-api/build.sbt @@ -6,10 +6,10 @@ val toolkitTest = "org.scala-lang" %% "toolkit-test" % toolkitV val cask = "com.lihaoyi" %% "cask" % "0.9.1" val mainargs = "com.lihaoyi" %% "mainargs" % "0.5.4" +val requests = "com.lihaoyi" %% "requests" % "0.8.0" ThisBuild / scalaVersion := "3.2.2" -libraryDependencies += cask -libraryDependencies += mainargs +libraryDependencies ++= Seq(cask, mainargs, requests) 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 7d9ea8f..b696934 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 @@ -5,20 +5,27 @@ import org.thymeleaf.TemplateEngine import org.thymeleaf.context.Context import cask.model.Response import mainargs.{main, arg, ParserForMethods, Flag} +import scala.util.Try -object MinimalApplication extends cask.Routes{ +object MinimalApplication extends cask.Routes { @main def run( - @arg(name="port", short='p', doc="Port on which server will start service") + @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") + @arg(name = "host", doc = "Host on which server will start serving") 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(countries = countriesDb )) + override def allRoutes: Seq[cask.main.Routes] = Seq( + Routes(countries = countriesDb) + ) override def port: Int = portArg override def host: String = hostArg } @@ -26,14 +33,23 @@ object MinimalApplication extends cask.Routes{ } def loadCountries() = { - val countries: List[Country] = upickle.default.read[List[Country]]( - scala.io.Source.fromResource("temporary/all.json").getLines().mkString, - true + val defaultCountriesData: List[Country] = + upickle.default.read[List[Country]]( + scala.io.Source.fromResource("temporary/all.json").getLines().mkString, + true + ) + val apiDataRequest = requests.get("https://restcountries.com/v3.1/all") + val apiData = Try( + upickle.default.read[List[Country]](apiDataRequest.text(), true) ) - countries + if (apiData.isFailure) + println(s"> data load failed ${apiData}") + else + println(s"> api data load is successful") + + apiData.toOption.getOrElse(defaultCountriesData) } def main(args: Array[String]): Unit = ParserForMethods(this).runOrExit(args) - }