Skip to content

Instantly share code, notes, and snippets.

View adamw's full-sized avatar

Adam Warski adamw

View GitHub Profile
case class BooksQuery(year: Option[Year], limit: Option[Int])
val baseEndpoint: Endpoint[Unit, (StatusCode, ErrorInfo), Unit, Nothing] =
endpoint
.in("api" / "v1.0")
.errorOut(statusCode.and(jsonBody[ErrorInfo]))
val getBooks: Endpoint[(Option[Year], Option[Int]),
(StatusCode, ErrorInfo),
List[Book],
Nothing] = ...
import io.circe.generic.auto._
import tapir._
import tapir.json.circe._
import tapir.model.StatusCode
val getBooks = endpoint.get
.in("api" / "v1.0" / "books")
.in(query[Option[Year]]("year"))
.in(query[Option[Int]]("limit"))
.errorOut(statusCode)
import tapir.Codec.PlainCodec
implicit val yearCodec: PlainCodec[Year] =
implicitly[PlainCodec[Int]].map(new Year(_))(_.year)
class Year(val year: Int) extends AnyVal
case class Country(name: String)
case class Author(name: String, country: Country)
case class Book(id: UUID, title: String, year: Year, author: Author)
case class ErrorInfo(error: String)
val baseEndpoint: Endpoint[Unit, (StatusCode, ErrorInfo), Unit, Nothing] =
endpoint
.in("api" / "v1.0")
.errorOut(statusCode.and(jsonBody[ErrorInfo]))
val booksQueryInput: EndpointInput[BooksQuery] =
query[Option[Year]]("year")
.and(query[Option[Int]]("limit"))
.mapTo(BooksQuery)
@adamw
adamw / tapir.scala
Last active February 19, 2019 09:51
"com.softwaremill.tapir" %% "tapir-core" % "0.1"
"com.softwaremill.tapir" %% "tapir-akka-http-server" % "0.1"
"com.softwaremill.tapir" %% "tapir-json-circe" % "0.1"
"com.softwaremill.tapir" %% "tapir-openapi-docs" % "0.1"
"com.softwaremill.tapir" %% "tapir-openapi-circe-yaml" % "0.1"
import tapir.docs.openapi._
import tapir.openapi.circe.yaml._
val docs: OpenAPI = List(addBook, findBook).toOpenAPI(
"The Tapir Library", "1.0")
val docsYaml: String = docs.toYaml
val bookBody = jsonBody[Book]
.description("The book")
.example(Book("Pride and Prejudice", "Novel", 1813))
val addBook: Endpoint[(Book, String), Unit, Boolean, Nothing] =
endpoint
.description("Adds a new book, if the user is authorized")
.post
.in("book" / "add")
.in(bookBody)