LoginSignup
2
0

More than 1 year has passed since last update.

Coursier + ammonite + Scala3 で簡単なスクリプト作成

Posted at

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 で実行

HelloScala3.scala
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 で実行

HelloAmmScala3.sc
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 をプロパティで渡している箇所はもっと良い方法がありそう・・・)

GetBook.sc
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 のフィールドを拡張すればもっと出力結果を充実させることも可能です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0