added assignment 8 ex 2
This commit is contained in:
		
							
								
								
									
										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)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user