added assignment 8 ex 2
This commit is contained in:
parent
6954695a0d
commit
bed771a04e
62
src/Assignment8/Ex2.scala
Normal file
62
src/Assignment8/Ex2.scala
Normal file
@ -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)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user