From bed771a04ec81fa7ddc57652eb66ac4b517d8530 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Mon, 5 May 2025 18:43:26 +0200 Subject: [PATCH] added assignment 8 ex 2 --- src/Assignment8/Ex2.scala | 62 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/Assignment8/Ex2.scala diff --git a/src/Assignment8/Ex2.scala b/src/Assignment8/Ex2.scala new file mode 100644 index 0000000..9167bf7 --- /dev/null +++ b/src/Assignment8/Ex2.scala @@ -0,0 +1,62 @@ +package Assignment8 + +import net.liftweb.json +import net.liftweb.json.DefaultFormats + +import java.net.URI +import scala.concurrent.duration.Duration +import scala.concurrent.{Await, Future} +import scala.sys.process._ +import scala.util.{Failure, Success} + +object Ex2 extends App { + implicit val ec: scala.concurrent.ExecutionContext = scala.concurrent.ExecutionContext.global + implicit val formats: DefaultFormats.type = DefaultFormats + + case class Coin(id: String, icon: String, name: String, symbol: String, rank: Int, price: Double, priceBtc: Double, volume: Double, marketCap: Double, availableSupply: Double, totalSupply: Double, fullyDilutedValuation: Double, priceChange1h: Double, priceChange1d: Double, priceChange1w: Double, redditUrl: String, websiteUrl: String, twitterUrl: String, explorers: List[String]) + case class Currency(name: String, rate: Double, symbol: String, imageUrl: String) + + val BITCOIN_TO_USD: String = "https://openapiv1.coinstats.app/coins/bitcoin" + val USD_TO_CHF: String = "https://openapiv1.coinstats.app/fiats" + private val API_KEY: String = sys.env.getOrElse("OPENAPI_KEY", "") + + def getUrl(url: String): Future[String] = { + Future { + val uri: URI = new URI(url) + val cmd: String = "curl -s -H 'X-API-KEY: " + API_KEY + "' " + uri.toString + cmd.!! + } + } + + def extractBitcoinToUSDRate(jsonStr: String): Double = { + val data: Coin = json.parse(jsonStr).extract[Coin] + return data.price + } + + def extractUSDToCHFRate(jsonStr: String): Double = { + val data: List[Currency] = json.parse(jsonStr).extract[List[Currency]] + return data.find(currency => currency.name == "CHF") + .map(currency => currency.rate) + .get + } + + def getBitcoinToUSD: Future[Double] = { + getUrl(BITCOIN_TO_USD) map extractBitcoinToUSDRate + } + + def getUSDToCHF: Future[Double] = { + getUrl(USD_TO_CHF) map extractUSDToCHFRate + } + + val f: Future[Double] = for { + btc2usd <- getBitcoinToUSD + usd2chf <- getUSDToCHF + } yield btc2usd * usd2chf + + f onComplete { + case Success(value) => println(s"1 BTC == $value CHF") + case Failure(e) => println(s"An error occurred: $e") + } + + Await.ready(f, Duration.Inf) +}