Coursier + ammonite + Scala3 で簡単なスクリプトを作成してみました。
Coursier のインストール
Coursier = Scala のインストーラツール
インストールが必要なものすべてを自動でインストールできる。便利。
参考サイト
GETTING STARTED WITH SCALA 3:
https://docs.scala-lang.org/ja/scala3/getting-started.html
インストール手順
ほぼ参考サイトの手順通りに進めました。
今回は brew でインストールしました。
Coursier のインストール
brew install coursier/formulas/coursier && cs setup
coursier に Scala3 をインストール
デフォルトでは coursier に Scala2 しか入らないので、
Scala3 を coursier でインストールします。
cs install scala3-compiler
cs install scala3
これで Scala3 でのコンパイル・実行ができます。
coursier を使って素振り
cs launch scala3 で実行
enum Color:
case Red, Blue, Green
@main
def main() =
println(s"Hello ${Color.Red} ${Color.Blue} ${Color.Green}")
実行
$ cs launch scala3 -- HelloScala3.scala
Hello Red Blue Green
cs launch ammonite で実行
enum Color:
case Red, Blue, Green
println(s"Hello Amm Scala3 ${Color.Red} ${Color.Blue} ${Color.Green}")
実行
$ cs launch ammonite --scala 3.0.2 -- HelloAmmScala3.sc
Hello Amm Scala3 Red Blue Green
簡単なスクリプト作成
とりあえず素振りできたので、
APIを叩いてレスポンスを取得する簡単なスクリプトを作ってみます。
今回は以下のライブラリとAPIを使わせていただき、
書籍のISBNと一致する書籍タイトルを取得するスクリプトを作ってみます。
ライブラリ
sttp : https://github.com/softwaremill/sttp
circe : https://circe.github.io/circe/
API
Google Books API : https://developers.google.com/books/docs/v1/using#WorkingVolumes
以下のようなリクエストで書籍情報を取得できます。
https://www.googleapis.com/books/v1/volumes?q=${クエリ}
作ったスクリプト
作ったもの。
(※ISBN をプロパティで渡している箇所はもっと良い方法がありそう・・・)
import $ivy.`com.softwaremill.sttp.client3::core:3.3.14`
import $ivy.`io.circe::circe-core:0.14.0`
import $ivy.`io.circe::circe-generic:0.14.0`
import $ivy.`io.circe::circe-parser:0.14.0`
import sttp.client3._
import io.circe.generic.auto._
import io.circe.parser._
// TODO 引数をシステム・プロパティで渡しているが、 ammonite の仕組みで渡せると良さそう。
Option(sys.props("isbnArg")) match
case Some(isbn) => request(isbn)
case None => println("isbnArg is required")
def request(isbn:String) =
val url = s"https://www.googleapis.com/books/v1/volumes?q=isbn:$isbn"
val request =basicRequest.get(uri"${url}")
val backend = HttpURLConnectionBackend()
val response = request.send(backend)
for {
body <- response.body
result <- parse(body)
item <- result.items
} println(s"${item.volumeInfo}")
// APIのレスポンスから取得したい要素を case class のフィールドで定義
case class Result(items:List[Book])
case class Book(volumeInfo:VolumeInfo)
case class VolumeInfo(title:String)
def parse(responseBody:String) = decode[Result](responseBody)
実行コマンドと結果
$ cs launch ammonite --java-opt -DisbnArg=429501155X --scala 3.0.2 -- GetBook.sc
VolumeInfo(Scalaスケーラブルプログラミング 第4版)
無事書籍タイトルが取得できました。
APIからのレスポンスにはもっと豊富な情報があるので、case class のフィールドを拡張すればもっと出力結果を充実させることも可能です。