sbt/project/Travis.scala

85 lines
1.8 KiB
Scala

import argonaut._
import argonaut.Argonaut._
import argonaut.ArgonautShapeless._
import sbt.Logger
object Travis {
final case class BuildId(value: Long) extends AnyVal
object BuildId {
implicit val decode: DecodeJson[BuildId] =
DecodeJson.LongDecodeJson.map(BuildId(_))
}
final case class JobId(value: Long) extends AnyVal
object JobId {
implicit val decode: DecodeJson[JobId] =
DecodeJson.LongDecodeJson.map(JobId(_))
}
final case class CommitId(value: Long) extends AnyVal
object CommitId {
implicit val decode: DecodeJson[CommitId] =
DecodeJson.LongDecodeJson.map(CommitId(_))
}
final case class Build(
id: BuildId,
job_ids: List[JobId],
pull_request: Boolean,
state: String,
commit_id: CommitId
)
final case class Builds(
builds: List[Build]
)
final case class Commit(
id: CommitId,
sha: String,
branch: String
)
final case class JobDetails(
state: String
)
final case class Job(
commit: Commit,
job: JobDetails
)
val extraHeaders = Seq(
"Accept" -> "application/vnd.travis-ci.2+json"
)
def builds(repo: String, log: Logger): List[Build] = {
val url = s"https://api.travis-ci.org/repos/$repo/builds"
val resp = HttpUtil.fetch(url, log, extraHeaders)
resp.decodeEither[Builds] match {
case Left(err) =>
sys.error(s"Error decoding response from $url: $err")
case Right(builds) =>
log.info(s"Got ${builds.builds.length} builds")
builds.builds
}
}
def job(id: JobId, log: Logger): Job = {
val url = s"https://api.travis-ci.org/jobs/${id.value}"
val resp = HttpUtil.fetch(url, log, extraHeaders)
resp.decodeEither[Job] match {
case Left(err) =>
sys.error(s"Error decoding response from $url: $err")
case Right(job) =>
job
}
}
}