Skip to content

Repository files navigation

tapir, or Typed API descRiptions

Join the chat at https://gitter.im/softwaremill/tapirCIMaven Central

With tapir, you can describe HTTP API endpoints as immutable Scala values. Each endpoint can contain a number of input parameters, error-output parameters, and normal-output parameters. An endpoint specification can be interpreted as:

  • a server, given the "business logic": a function, which computes output parameters based on input parameters. Currently supported:
  • a client, which is a function from input parameters to output parameters. Currently supported:
  • documentation. Currently supported:

Teaser

importsttp.tapir._importsttp.tapir.generic.auto._importsttp.tapir.json.circe._importio.circe.generic.auto._typeLimit=InttypeAuthToken=StringcaseclassBooksFromYear(genre: String, year: Int)
caseclassBook(title: String)
// Define an endpointvalbooksListing:Endpoint[(BooksFromYear, Limit, AuthToken), String, List[Book], Any] = endpoint
.get
.in(("books"/ path[String]("genre") / path[Int]("year")).mapTo(BooksFromYear))
.in(query[Limit]("limit").description("Maximum number of books to retrieve"))
.in(header[AuthToken]("X-Auth-Token"))
.errorOut(stringBody)
.out(jsonBody[List[Book]])
// Generate OpenAPI documentationimportsttp.tapir.docs.openapi.OpenAPIDocsInterpreterimportsttp.tapir.openapi.circe.yaml._valdocs=OpenAPIDocsInterpreter.toOpenAPI(booksListing, "My Bookshop", "1.0")
println(docs.toYaml)
// Convert to akka-http Routeimportsttp.tapir.server.akkahttp.AkkaHttpServerInterpreterimportakka.http.scaladsl.server.Routeimportscala.concurrent.FuturedefbookListingLogic(bfy: BooksFromYear,
limit: Limit,
at: AuthToken):Future[Either[String, List[Book]]] =Future.successful(Right(List(Book("The Sorrows of Young Werther"))))
valbooksListingRoute:Route=AkkaHttpServerInterpreter
.toRoute(booksListing)((bookListingLogic _).tupled)
// Convert to sttp Requestimportsttp.tapir.client.sttp.SttpClientInterpreterimportsttp.client3._valbooksListingRequest:Request[DecodeResult[Either[String, List[Book]]], Any] =SttpClientInterpreter
.toRequest(booksListing, Some(uri"http://localhost:8080"))
.apply((BooksFromYear("SF", 2016), 20, "xyz-abc-123"))

Documentation

tapir documentation is available at tapir.softwaremill.com.

Quickstart with sbt

Add the following dependency:

"com.softwaremill.sttp.tapir"%%"tapir-core"%"0.18.0-M7"

You'll need partial unification enabled in the compiler (alternatively, you'll need to manually provide type arguments in some cases):

scalacOptions +="-Ypartial-unification"

Then, import:

importsttp.tapir._

And finally, type endpoint. and see where auto-complete gets you!


Sidenote for scala 2.12.4 and higher: if you encounter an issue with compiling your project because of a StackOverflowException related to this scala bug, please increase your stack memory. Example:

sbt -J-Xss4M clean compile

Other sttp projects

sttp is a family of Scala HTTP-related projects, and currently includes:

  • sttp client: the Scala HTTP client you always wanted!
  • sttp tapir: this project
  • sttp model: simple HTTP model classes (used by client & tapir)

Contributing

Tapir is an early stage project. Everything might change. All suggestions welcome :)

See the list of issues and pick one! Or report your own.

If you are having doubts on the why or how something works, don't hesitate to ask a question on gitter or via github. This probably means that the documentation, scaladocs or code is unclear and be improved for the benefit of all.

Testing locally

The JS tests use Gecko instead of Chrome, although this causes another problem: out of memory when running JS tests for multiple modules. Work-arounds:

  • run only JVM tests using testJVM
  • test single JS projects
  • use CI (GitHub Actions) to test all projects - the .github/workflows/ci.yml enumerates them one by one

You can test only server/client/doc/other projects using testServers, testClients, testDocs and testOther.

Commercial Support

We offer commercial support for tapir and related technologies, as well as development services. Contact us to learn more about our offer!

Copyright

Copyright (C) 2018-2021 SoftwareMill https://softwaremill.com.

About

Declarative, type-safe web endpoints library

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages