Finch provides a combinator API over the Finagle HTTP services. An Endpoint[A], main abstraction for which combinators are defined, represents an HTTP endpoint that takes a request and returns a value of type A.

Look and Feel

The following example creates an HTTP server (powered by Finagle) that serves the only endpoint POST /time. This endpoint takes a Locale instance represented as JSON in request body and returns a current Time for this locale.

build.sbt:

libraryDependencies ++= Seq(
  "com.github.finagle" %% "finch-core" % "0.16.0-M5",
  "com.github.finagle" %% "finch-circe" % "0.16.0-M5",
  "io.circe" %% "circe-generic" % "0.9.0-M2"
)

Main.scala:

import com.twitter.finagle.Http
import com.twitter.util.Await

import io.finch._
import io.finch.circe._
import io.circe.generic.auto._

object Main extends App {

  case class Locale(language: String, country: String)
  case class Time(locale: Locale, time: String)

  def currentTime(l: java.util.Locale): String =
    java.util.Calendar.getInstance(l).getTime.toString

  val time: Endpoint[Time] =
    post("time" :: jsonBody[Locale]) { l: Locale =>
      Ok(Time(l, currentTime(new java.util.Locale(l.language, l.country))))
    }

  Await.ready(Http.server.serve(":8081", time.toService))
}

What People Say?

@mandubian on Twitter:

I think there is clearly room for great improvements using pure FP in Scala for HTTP API & #Finch is clearly a good candidate.

@tperrigo on Reddit:

I’m currently working on a project using Finch (with Circe to serialize my case classes to JSON without any boilerplate code – in fact, besides the import statements, I don’t have to do anything to transform my results to JSON) and am extremely impressed. There are still a few things in flux with Finch, but I’d recommend giving it a look.

@arnarthor on Gitter:

I am currently re-writing a NodeJS service in Finch and the code is so much cleaner and readable and about two thirds the amount of lines. Really love this.

Finch Talks

Scala

sbt-microsites plugin is completely written in Scala

SBT

sbt-microsites plugin uses SBT and other sbt plugins to generate microsites easily

Jekyll

Jekyll allows for the transformation of plain text into static websites and blogs.