├── .git-blame-ignore-revs
├── .github
├── ISSUE_TEMPLATE
│ └── bug_report.md
├── dependabot.yaml
├── labeler.yml
├── release-drafter.yml
└── workflows
│ ├── ci.yml
│ ├── dependency-graph.yml
│ ├── rebase-cmd-dispatch.yml
│ ├── rebase-cmd.yml
│ ├── scala-steward.yml
│ └── test-report.yml
├── .gitignore
├── .readthedocs.yaml
├── .sbtopts
├── .scala-steward.conf
├── .scalafix.conf
├── .scalafmt.conf
├── LICENSE
├── README.md
├── banner.png
├── build.sbt
├── client
├── core
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── client
│ │ └── ClientOutputParams.scala
├── http4s-client
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── http4s
│ │ │ ├── EndpointToHttp4sClient.scala
│ │ │ ├── Http4sClientInterpreter.scala
│ │ │ └── Http4sClientOptions.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── client
│ │ └── http4s
│ │ ├── Http4ClientStreamingTests.scala
│ │ ├── Http4sClientBasicTests.scala
│ │ ├── Http4sClientRequestTests.scala
│ │ └── Http4sClientTests.scala
├── play-client
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── play
│ │ │ ├── EndpointToPlayClient.scala
│ │ │ ├── PlayClientInterpreter.scala
│ │ │ └── PlayClientOptions.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── client
│ │ └── play
│ │ ├── PlayClientBasicTests.scala
│ │ ├── PlayClientStreamingTests.scala
│ │ └── PlayClientTests.scala
├── play29-client
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── play
│ │ │ ├── EndpointToPlayClient.scala
│ │ │ ├── PlayClientInterpreter.scala
│ │ │ └── PlayClientOptions.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── client
│ │ └── play
│ │ ├── PlayClientBasicTests.scala
│ │ ├── PlayClientStreamingTests.scala
│ │ └── PlayClientTests.scala
├── sttp-client
│ └── src
│ │ ├── main
│ │ ├── scala
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp
│ │ │ │ ├── EndpointToSttpClient.scala
│ │ │ │ ├── SttpClientInterpreter.scala
│ │ │ │ ├── SttpClientOptions.scala
│ │ │ │ └── WebSocketToPipe.scala
│ │ ├── scalajs
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp
│ │ │ │ ├── EndpointToSttpClientExtensions.scala
│ │ │ │ ├── SttpClientInterpreterExtensions.scala
│ │ │ │ └── ws
│ │ │ │ ├── fs2
│ │ │ │ ├── TapirSttpClientFs2WebSockets.scala
│ │ │ │ ├── WebSocketToFs2Pipe.scala
│ │ │ │ └── package.scala
│ │ │ │ └── zio
│ │ │ │ ├── TapirSttpClientZioWebSockets.scala
│ │ │ │ ├── WebSocketToZioPipe.scala
│ │ │ │ └── package.scala
│ │ ├── scalajvm-2
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp
│ │ │ │ └── ws
│ │ │ │ └── akkahttp
│ │ │ │ ├── TapirSttpClientAkkaHttpWebSockets.scala
│ │ │ │ ├── WebSocketToAkkaPipe.scala
│ │ │ │ └── package.scala
│ │ ├── scalajvm
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp
│ │ │ │ ├── EndpointToSttpClientExtensions.scala
│ │ │ │ ├── SttpClientInterpreterExtensions.scala
│ │ │ │ └── ws
│ │ │ │ ├── fs2
│ │ │ │ ├── TapirSttpClientFs2WebSockets.scala
│ │ │ │ ├── WebSocketToFs2Pipe.scala
│ │ │ │ └── package.scala
│ │ │ │ ├── pekkohttp
│ │ │ │ ├── TapirSttpClientPekkoHttpWebSockets.scala
│ │ │ │ ├── WebSocketToPekkoPipe.scala
│ │ │ │ └── package.scala
│ │ │ │ └── zio
│ │ │ │ ├── TapirSttpClientZioWebSockets.scala
│ │ │ │ ├── WebSocketToZioPipe.scala
│ │ │ │ └── package.scala
│ │ └── scalanative
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp
│ │ │ ├── EndpointToSttpClientExtensions.scala
│ │ │ └── SttpClientInterpreterExtensions.scala
│ │ └── test
│ │ ├── scala
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp
│ │ │ ├── SttpClientBasicTests.scala
│ │ │ ├── SttpClientMultipartTests.scala
│ │ │ └── SttpClientRequestTests.scala
│ │ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp
│ │ │ ├── SttpClientTests.scala
│ │ │ ├── SttpClientWebSocketZioTests.scala
│ │ │ └── SttpClientZioTests.scala
│ │ ├── scalajvm-2
│ │ └── sttp.tapir.client.sttp
│ │ │ ├── SttpAkkaClientTests.scala
│ │ │ └── SttpAkkaClientWebSocketTests.scala
│ │ ├── scalajvm
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp
│ │ │ ├── SttpClientBasicZioTests.scala
│ │ │ ├── SttpClientPekkoTests.scala
│ │ │ ├── SttpClientStreamingTests.scala
│ │ │ ├── SttpClientStreamingZioTests.scala
│ │ │ ├── SttpClientTests.scala
│ │ │ ├── SttpClientWebSocketPekkoTests.scala
│ │ │ ├── SttpClientWebSocketTests.scala
│ │ │ ├── SttpClientWebSocketZioTests.scala
│ │ │ └── SttpClientZioTests.scala
│ │ └── scalanative
│ │ └── sttp
│ │ └── tapir
│ │ └── client
│ │ └── sttp
│ │ └── SttpClientTests.scala
├── sttp-client4
│ └── src
│ │ ├── main
│ │ ├── scala
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp4
│ │ │ │ ├── EndpointToSttpClient.scala
│ │ │ │ ├── EndpointToSttpClientBase.scala
│ │ │ │ ├── SttpClientInterpreter.scala
│ │ │ │ ├── SttpClientOptions.scala
│ │ │ │ ├── WebSocketToPipe.scala
│ │ │ │ ├── package.scala
│ │ │ │ ├── stream
│ │ │ │ ├── StreamEndpointToSttpClient.scala
│ │ │ │ ├── StreamSttpClientInterpreter.scala
│ │ │ │ └── StreamsNotWebSockets.scala
│ │ │ │ └── ws
│ │ │ │ ├── WebSocketEndpointToSttpClient.scala
│ │ │ │ └── WebSocketSttpClientInterpreter.scala
│ │ ├── scalajs
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp4
│ │ │ │ ├── WebSocketEndpointToSttpClientExtensions.scala
│ │ │ │ └── ws
│ │ │ │ ├── fs2
│ │ │ │ ├── TapirSttpClientFs2WebSockets.scala
│ │ │ │ ├── WebSocketToFs2Pipe.scala
│ │ │ │ └── package.scala
│ │ │ │ └── zio
│ │ │ │ ├── TapirSttpClientZioWebSockets.scala
│ │ │ │ ├── WebSocketToZioPipe.scala
│ │ │ │ └── package.scala
│ │ ├── scalajvm-2
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp4
│ │ │ │ └── ws
│ │ │ │ └── akkahttp
│ │ │ │ ├── TapirSttpClientAkkaHttpWebSockets.scala
│ │ │ │ ├── WebSocketToAkkaPipe.scala
│ │ │ │ └── package.scala
│ │ ├── scalajvm
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── client
│ │ │ │ └── sttp4
│ │ │ │ ├── WebSocketEndpointToSttpClientExtensions.scala
│ │ │ │ └── ws
│ │ │ │ ├── fs2
│ │ │ │ ├── TapirSttpClientFs2WebSockets.scala
│ │ │ │ ├── WebSocketToFs2Pipe.scala
│ │ │ │ └── package.scala
│ │ │ │ ├── pekkohttp
│ │ │ │ ├── TapirSttpClientPekkoHttpWebSockets.scala
│ │ │ │ ├── WebSocketToPekkoPipe.scala
│ │ │ │ └── package.scala
│ │ │ │ └── zio
│ │ │ │ ├── TapirSttpClientZioWebSockets.scala
│ │ │ │ ├── WebSocketToZioPipe.scala
│ │ │ │ └── package.scala
│ │ └── scalanative
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp4
│ │ │ └── WebSocketEndpointToSttpClientExtensions.scala
│ │ └── test
│ │ ├── scala
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp4
│ │ │ ├── SttpClientMultipartTests.scala
│ │ │ ├── SttpClientRequestTests.scala
│ │ │ └── SttpClientSimpleTests.scala
│ │ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp4
│ │ │ ├── SttpClientTestsSender.scala
│ │ │ └── ws
│ │ │ ├── WebSocketSttpClientZioTests.scala
│ │ │ └── WebSocketSttpClientZioTestsSender.scala
│ │ ├── scalajvm
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── sttp4
│ │ │ ├── SttpClientTestsSender.scala
│ │ │ ├── SttpClientZioTests.scala
│ │ │ ├── SttpClientZioTestsSender.scala
│ │ │ ├── stream
│ │ │ ├── StreamSttpClientTests.scala
│ │ │ ├── StreamSttpClientTestsSender.scala
│ │ │ ├── StreamSttpClientZioTests.scala
│ │ │ └── StreamSttpClientZioTestsSender.scala
│ │ │ └── ws
│ │ │ ├── WebSocketSttpClientPekkoTests.scala
│ │ │ ├── WebSocketSttpClientPekkoTestsSender.scala
│ │ │ ├── WebSocketSttpClientTests.scala
│ │ │ ├── WebSocketSttpClientTestsSender.scala
│ │ │ ├── WebSocketSttpClientZioTests.scala
│ │ │ └── WebSocketSttpClientZioTestsSender.scala
│ │ └── scalanative
│ │ └── sttp
│ │ └── tapir
│ │ └── client
│ │ └── sttp
│ │ └── SttpClientTestsSender.scala
├── tests
│ └── src
│ │ └── main
│ │ ├── scala
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── tests
│ │ │ ├── ClientBasicTests.scala
│ │ │ ├── ClientMultipartTests.scala
│ │ │ ├── ClientStreamingTests.scala
│ │ │ ├── ClientTests.scala
│ │ │ └── ClientWebSocketTests.scala
│ │ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── tests
│ │ │ └── ClientTestsPlatform.scala
│ │ ├── scalajvm
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── client
│ │ │ └── tests
│ │ │ └── ClientTestsPlatform.scala
│ │ └── scalanative
│ │ └── sttp
│ │ └── tapir
│ │ └── client
│ │ └── tests
│ │ └── ClientTestsPlatform.scala
└── testserver
│ └── src
│ └── main
│ ├── resources
│ └── logback.xml
│ └── scala
│ └── sttp
│ └── tapir
│ └── client
│ └── tests
│ └── HttpServer.scala
├── core
└── src
│ ├── main
│ ├── boilerplate-gen
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── internal
│ │ │ ├── ParamsToSeq.scala
│ │ │ └── SeqToParams.scala
│ │ │ └── typelevel
│ │ │ ├── TupleArity.scala
│ │ │ └── TupleOps.scala
│ ├── boilerplate
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── internal
│ │ │ ├── ParamsToSeq.scala.template
│ │ │ └── SeqToParams.scala.template
│ │ │ └── typelevel
│ │ │ ├── TupleArity.scala.template
│ │ │ └── TupleOps.scala.template
│ ├── resources
│ │ └── mimeByExtensions.txt
│ ├── scala-2.13+
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── macros
│ │ │ └── ModifyMacroSupport.scala
│ ├── scala-2.13-
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── CodecExtensions2.scala
│ │ │ └── macros
│ │ │ └── ModifyMacroSupport.scala
│ ├── scala-2
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── generic
│ │ │ ├── auto
│ │ │ │ ├── SchemaDerivation.scala
│ │ │ │ ├── SchemaMagnoliaDerivation.scala
│ │ │ │ └── package.scala
│ │ │ └── internal
│ │ │ │ └── MagnoliaDerivedMacro.scala
│ │ │ ├── internal
│ │ │ ├── AttributeKeyMacro.scala
│ │ │ ├── CaseClassUtil.scala
│ │ │ ├── CodecEnumerationMacro.scala
│ │ │ ├── CodecValueClassMacro.scala
│ │ │ ├── Debug.scala
│ │ │ ├── EndpointAnnotationsMacro.scala
│ │ │ ├── EndpointInputAnnotationsMacro.scala
│ │ │ ├── EndpointOutputAnnotationsMacro.scala
│ │ │ ├── ErasureSameAsTypeMacro.scala
│ │ │ ├── FormCodecMacro.scala
│ │ │ ├── MapToMacro.scala
│ │ │ ├── ModifySchemaMacro.scala
│ │ │ ├── MultipartCodecMacro.scala
│ │ │ ├── OneOfMacro.scala
│ │ │ ├── SchemaAnnotationsMacro.scala
│ │ │ ├── SchemaEnumerationMacro.scala
│ │ │ ├── SchemaMapMacro.scala
│ │ │ └── ValidatorEnumerationMacro.scala
│ │ │ ├── macros
│ │ │ ├── AttributeKeyMacros.scala
│ │ │ ├── CodecMacros.scala
│ │ │ ├── EndpointInputMacros.scala
│ │ │ ├── EndpointMacros.scala
│ │ │ ├── EndpointOutputMacros.scala
│ │ │ ├── EndpointTransputMacros.scala
│ │ │ ├── ErasureSameAsTypeMacros.scala
│ │ │ ├── FormCodecMacros.scala
│ │ │ ├── MultipartCodecMacros.scala
│ │ │ ├── SchemaAnnotationsMacros.scala
│ │ │ ├── SchemaMacros.scala
│ │ │ └── ValidatorMacros.scala
│ │ │ └── typelevel
│ │ │ └── MatchTypeMacros.scala
│ ├── scala-3-2.13+
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── CodecExtensions2.scala
│ │ │ └── model
│ │ │ └── package.scala
│ ├── scala-3
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── generic
│ │ │ └── auto
│ │ │ │ ├── SchemaDerivation.scala
│ │ │ │ ├── SchemaMagnoliaDerivation.scala
│ │ │ │ └── package.scala
│ │ │ ├── internal
│ │ │ ├── AnnotationsMacros.scala
│ │ │ ├── CaseClass.scala
│ │ │ ├── CodecValueClassMacro.scala
│ │ │ ├── CompileTimeErrors.scala
│ │ │ ├── EnumerationMacros.scala
│ │ │ ├── MappingMacros.scala
│ │ │ ├── SNameMacros.scala
│ │ │ └── SchemaAnnotationsMacro.scala
│ │ │ ├── macros
│ │ │ ├── AttributeKeyMacros.scala
│ │ │ ├── CodecMacros.scala
│ │ │ ├── EndpointInputMacros.scala
│ │ │ ├── EndpointMacros.scala
│ │ │ ├── EndpointOutputMacros.scala
│ │ │ ├── EndpointTransputMacros.scala
│ │ │ ├── ErasureSameAsTypeMacros.scala
│ │ │ ├── FormCodecMacros.scala
│ │ │ ├── ModifyMacroSupport.scala
│ │ │ ├── MultipartCodecMacros.scala
│ │ │ ├── SchemaAnnotationsMacros.scala
│ │ │ ├── SchemaMacros.scala
│ │ │ ├── ValidatorMacros.scala
│ │ │ └── union_derivation.scala
│ │ │ └── typelevel
│ │ │ └── MatchTypeMacros.scala
│ ├── scala
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── Codec.scala
│ │ │ ├── CodecFormat.scala
│ │ │ ├── DecodeResult.scala
│ │ │ ├── Endpoint.scala
│ │ │ ├── EndpointIO.scala
│ │ │ ├── FieldName.scala
│ │ │ ├── FileRange.scala
│ │ │ ├── InputStreamRange.scala
│ │ │ ├── Mapping.scala
│ │ │ ├── Schema.scala
│ │ │ ├── SchemaAnnotations.scala
│ │ │ ├── SchemaType.scala
│ │ │ ├── Tapir.scala
│ │ │ ├── TapirAliases.scala
│ │ │ ├── TapirAuth.scala
│ │ │ ├── Validator.scala
│ │ │ ├── attribute.scala
│ │ │ ├── capabilities
│ │ │ └── NoStreams.scala
│ │ │ ├── generic
│ │ │ ├── Configuration.scala
│ │ │ └── Derived.scala
│ │ │ ├── internal
│ │ │ ├── ShowPathTemplate.scala
│ │ │ └── package.scala
│ │ │ ├── macros
│ │ │ ├── CreateDerivedEnumerationCodec.scala
│ │ │ ├── CreateDerivedEnumerationSchema.scala
│ │ │ └── ModifyMacroFunctorSupport.scala
│ │ │ ├── model
│ │ │ ├── Delimited.scala
│ │ │ ├── ServerRequest.scala
│ │ │ ├── StatusCodeRange.scala
│ │ │ ├── UsernamePassword.scala
│ │ │ └── ws.scala
│ │ │ ├── package.scala
│ │ │ ├── server
│ │ │ ├── PartialServerEndpoint.scala
│ │ │ ├── PartialServerEndpointSync.scala
│ │ │ ├── PartialServerEndpointWithSecurityOutput.scala
│ │ │ ├── PartialServerEndpointWithSecurityOutputSync.scala
│ │ │ └── ServerEndpoint.scala
│ │ │ └── typelevel
│ │ │ ├── BinaryTupleOp.scala
│ │ │ ├── ErasureSameAsType.scala
│ │ │ ├── MatchType.scala
│ │ │ └── ParamConcat.scala
│ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── CodecExtensions.scala
│ │ │ ├── Defaults.scala
│ │ │ ├── TapirExtensions.scala
│ │ │ ├── internal
│ │ │ └── UrlencodedData.scala
│ │ │ └── static
│ │ │ └── TapirStaticContentEndpoints.scala
│ ├── scalajvm
│ │ └── sttp
│ │ │ └── tapir
│ │ │ ├── CodecExtensions.scala
│ │ │ ├── Defaults.scala
│ │ │ ├── TapirExtensions.scala
│ │ │ ├── internal
│ │ │ ├── MimeByExtensionDB.scala
│ │ │ └── UrlencodedData.scala
│ │ │ └── static
│ │ │ ├── Files.scala
│ │ │ ├── Resources.scala
│ │ │ ├── TapirStaticContentEndpoints.scala
│ │ │ ├── model.scala
│ │ │ └── package.scala
│ └── scalanative
│ │ └── sttp
│ │ └── tapir
│ │ ├── CodecExtensions.scala
│ │ ├── Defaults.scala
│ │ ├── TapirExtensions.scala
│ │ ├── internal
│ │ └── UrlencodedData.scala
│ │ └── static
│ │ └── TapirStaticContentEndpoints.scala
│ └── test
│ ├── scala-2
│ └── sttp
│ │ └── tapir
│ │ ├── LegacySchemaApplyValidationTest.scala
│ │ ├── SchemaMacroTest2.scala
│ │ ├── SchemaMacroTestData2.scala
│ │ └── generic
│ │ └── LegacySchemaGenericAutoTest.scala
│ ├── scala-3-2.13+
│ └── sttp
│ │ └── tapir
│ │ └── CodecDelimitedTest.scala
│ ├── scala-3
│ └── sttp
│ │ └── tapir
│ │ ├── CodecScala3Test.scala
│ │ ├── EndpointScala3Test.scala
│ │ ├── SchemaMacroScala3Test.scala
│ │ └── ValidatorScala3EnumTest.scala
│ ├── scala
│ └── sttp
│ │ └── tapir
│ │ ├── AttributeTest.scala
│ │ ├── CodecTest.scala
│ │ ├── EndpointTest.scala
│ │ ├── SchemaAnnotationsTest.scala
│ │ ├── SchemaAnnotationsTestData.scala
│ │ ├── SchemaApplyValidationTest.scala
│ │ ├── SchemaApplyValidationTestData.scala
│ │ ├── SchemaMacroTest.scala
│ │ ├── SchemaMacroTestData.scala
│ │ ├── SchemaTest.scala
│ │ ├── TestUtil.scala
│ │ ├── ValidatorTest.scala
│ │ ├── annotations
│ │ └── DeriveEndpointIOTest.scala
│ │ ├── generic
│ │ ├── EnumsCodecDerivationTest.scala
│ │ ├── FormCodecDerivationTest.scala
│ │ ├── MultipartCodecDerivationTest.scala
│ │ ├── SchemaGenericAutoTest.scala
│ │ └── ValueClassCodecDerivationTest.scala
│ │ ├── internal
│ │ ├── RichEndpointInputTest.scala
│ │ ├── RichEndpointOutputTest.scala
│ │ └── UrlencodedDataTest.scala
│ │ ├── namespacing
│ │ └── SchemaMacroNamespaceTest.scala
│ │ ├── testdata
│ │ ├── BuiltinTypenameCollisionCaseClass.scala
│ │ └── BuiltinTypenameCollisionEnum.scala
│ │ └── typelevel
│ │ ├── MatchTypeTest.scala
│ │ └── ParamConcatTest.scala
│ ├── scalajs
│ └── sttp
│ │ └── tapir
│ │ ├── EndpointTestExtensions.scala
│ │ ├── generic
│ │ ├── FormCodecDerivationTestExtensions.scala
│ │ └── MultipartCodecDerivationTestExtensions.scala
│ │ └── typelevel
│ │ └── MatchTypeTestExtensions.scala
│ ├── scalajvm
│ └── sttp
│ │ └── tapir
│ │ ├── CodecTestDateTime.scala
│ │ ├── EndpointTestExtensions.scala
│ │ ├── SchemaSerialisationTest.scala
│ │ ├── generic
│ │ ├── FormCodecDerivationTestExtensions.scala
│ │ ├── MultipartCodecDerivationTestExtensions.scala
│ │ └── SchemaGenericSemiautoTest.scala
│ │ ├── internal
│ │ └── MimeByExtensionDBTest.scala
│ │ └── typelevel
│ │ └── MatchTypeTestExtensions.scala
│ └── scalanative
│ └── sttp
│ └── tapir
│ ├── EndpointTestExtensions.scala
│ ├── generic
│ ├── FormCodecDerivationTestExtensions.scala
│ └── MultipartCodecDerivationTestExtensions.scala
│ └── typelevel
│ └── MatchTypeTestExtensions.scala
├── doc
├── .gitignore
├── .python-version
├── Makefile
├── _static
│ └── css
│ │ └── custom.css
├── adopters.md
├── adopters
│ ├── adobe.png
│ ├── broad.png
│ ├── budgetbakers.svg
│ ├── carvana.svg
│ ├── colisweb.png
│ ├── dpg-recruitment.svg
│ ├── ematiq.png
│ ├── flo.svg
│ ├── fugo.png
│ ├── hootsuite.png
│ ├── hunters.png
│ ├── iceo.png
│ ├── kaizo.png
│ ├── kelkoogroup.png
│ ├── kensu.png
│ ├── moia.png
│ ├── moneyfarm.png
│ ├── ocado.png
│ ├── pits.svg
│ ├── process_street.png
│ ├── softwaremill.png
│ ├── swissborg.png
│ ├── swisscom.svg
│ ├── tranzzo.svg
│ └── wegtam.svg
├── adr
│ ├── 0001-explicit-encode-function-on-validator-enum.md
│ ├── 0002-codecs-schemas-validators.md
│ ├── 0003-shape-of-ios.md
│ ├── 0004-codecs-parametrised-by-raw-values.md
│ ├── 0005-rethinking-codecs.md
│ ├── 0006-partial-server-logic.md
│ ├── 0007-codecs-schemas-configuration.md
│ ├── 0008-effectful-maps.md
│ ├── 0009-lists-are-optional.md
│ ├── 0010-security-refactoring.md
│ ├── 0011-dedicated-schema-macros.md
│ └── 0012-extracting-schema-as-a-module.md
├── client
│ ├── http4s.md
│ ├── play.md
│ ├── sttp.md
│ └── sttp4.md
├── conf.py
├── docs
│ ├── asyncapi.md
│ ├── json-schema.md
│ └── openapi.md
├── endpoint
│ ├── basics.md
│ ├── codecs.md
│ ├── contenttype.md
│ ├── customtypes.md
│ ├── enumerations.md
│ ├── forms.md
│ ├── integrations.md
│ ├── ios.md
│ ├── json.md
│ ├── oneof.md
│ ├── pickler.md
│ ├── schemas.md
│ ├── security.md
│ ├── static.md
│ ├── streaming.md
│ ├── validation.md
│ ├── websockets.md
│ └── xml.md
├── examples.md
├── external.md
├── flake.lock
├── flake.nix
├── generate.md
├── generator
│ └── sbt-openapi-codegen.md
├── how-tos
│ └── delimited-path-parameters.md
├── index.md
├── logo.png
├── make.bat
├── other
│ ├── adr.md
│ ├── contributing.md
│ ├── goals.md
│ ├── grpc.md
│ ├── migrating.md
│ ├── mytapir.md
│ ├── other_interpreters.md
│ ├── stability.md
│ └── troubleshooting.md
├── press
│ └── tapir-1-0-released.md
├── quickstart.md
├── requirements.txt
├── scala_2_3_platforms.md
├── server
│ ├── akkahttp.md
│ ├── armeria.md
│ ├── aws.md
│ ├── debugging.md
│ ├── errors.md
│ ├── finatra.md
│ ├── http4s.md
│ ├── interceptors.md
│ ├── jdkhttp.md
│ ├── logic.md
│ ├── netty.md
│ ├── nima.md
│ ├── observability.md
│ ├── options.md
│ ├── overview.md
│ ├── path.md
│ ├── pekkohttp.md
│ ├── play.md
│ ├── vertx.md
│ ├── zio-http4s.md
│ └── ziohttp.md
├── support.md
├── testing.md
├── tutorials
│ ├── 01_hello_world.md
│ ├── 02_openapi_docs.md
│ ├── 03_json.md
│ ├── 04_errors.md
│ ├── 05_multiple_inputs_outputs.md
│ ├── 06_error_variants.md
│ └── 07_cats_effect.md
└── watch.sh
├── docs
├── apispec-docs
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── docs
│ │ │ └── apispec
│ │ │ ├── DocsExtension.scala
│ │ │ ├── DocsExtensions.scala
│ │ │ ├── EndpointInputMapper.scala
│ │ │ ├── SecurityRequirementsForEndpoints.scala
│ │ │ ├── SecuritySchemesForEndpoints.scala
│ │ │ ├── package.scala
│ │ │ └── schema
│ │ │ ├── MetaSchema.scala
│ │ │ ├── SchemaKey.scala
│ │ │ ├── SchemasForEndpoints.scala
│ │ │ ├── TSchemaToASchema.scala
│ │ │ ├── TapirSchemaToJsonSchema.scala
│ │ │ ├── ToKeyedSchemas.scala
│ │ │ ├── ToSchemaReference.scala
│ │ │ └── schema.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── docs
│ │ └── apispec
│ │ └── schema
│ │ └── TapirSchemaToJsonSchemaTest.scala
├── asyncapi-docs
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── docs
│ │ │ └── asyncapi
│ │ │ ├── AsyncAPIDocsOptions.scala
│ │ │ ├── AsyncAPIInterpreter.scala
│ │ │ ├── EndpointToAsyncAPIComponents.scala
│ │ │ ├── EndpointToAsyncAPIDocs.scala
│ │ │ ├── EndpointToAsyncAPIWebSocketChannel.scala
│ │ │ ├── ExampleConverter.scala
│ │ │ ├── MessagesForEndpoints.scala
│ │ │ └── package.scala
│ │ └── test
│ │ ├── resources
│ │ ├── expected_binding.yml
│ │ ├── expected_coproduct_with_discriminator.yml
│ │ ├── expected_description_header.yml
│ │ ├── expected_description_query.yml
│ │ ├── expected_extensions.yml
│ │ ├── expected_flags_header.yml
│ │ ├── expected_flags_query.yml
│ │ ├── expected_json_custom_schema_name.yml
│ │ ├── expected_json_example_name_summary.yml
│ │ ├── expected_json_examples.yml
│ │ ├── expected_json_json.yml
│ │ ├── expected_required_parameters.yml
│ │ ├── expected_security.yml
│ │ ├── expected_string.yml
│ │ ├── expected_string_json.yml
│ │ └── expected_two_endpoints.yml
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── docs
│ │ └── asyncapi
│ │ └── VerifyAsyncAPIYamlTest.scala
├── openapi-docs
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── docs
│ │ │ └── openapi
│ │ │ ├── CodecToMediaType.scala
│ │ │ ├── EndpointInputToDecodeFailureOutput.scala
│ │ │ ├── EndpointInputToParameterConverter.scala
│ │ │ ├── EndpointToOpenAPIComponents.scala
│ │ │ ├── EndpointToOpenAPIDocs.scala
│ │ │ ├── EndpointToOpenAPIPaths.scala
│ │ │ ├── EndpointToOperationResponse.scala
│ │ │ ├── ExampleConverter.scala
│ │ │ ├── OpenAPIDocsInterpreter.scala
│ │ │ └── OpenAPIDocsOptions.scala
│ │ └── test
│ │ ├── resources
│ │ ├── coproduct
│ │ │ ├── expected_coproduct.yml
│ │ │ ├── expected_coproduct_discriminator.yml
│ │ │ ├── expected_coproduct_discriminator_enum.yml
│ │ │ ├── expected_coproduct_discriminator_nested.yml
│ │ │ ├── expected_coproduct_discriminator_with_enum_circe.yml
│ │ │ ├── expected_coproduct_independent.yml
│ │ │ ├── expected_coproduct_nested.yml
│ │ │ ├── expected_coproduct_wrapped.yml
│ │ │ ├── expected_flat_either.yml
│ │ │ ├── expected_generic_coproduct.yml
│ │ │ ├── expected_recursive_coproducts.yml
│ │ │ └── expected_unfolded_coproduct_unfolded_array.yml
│ │ ├── decode_failure_output
│ │ │ ├── expected_default_400_response.yml
│ │ │ ├── expected_json_response_defined_in_options.yml
│ │ │ ├── expected_no_400_response.yml
│ │ │ ├── expected_response_defined_in_options.yml
│ │ │ └── expected_user_defined_response.yml
│ │ ├── enum
│ │ │ ├── expected_enum_collections.yml
│ │ │ ├── expected_enum_in_delimited_query.yml
│ │ │ ├── expected_enum_in_delimited_query_with_default.yml
│ │ │ ├── expected_enumeratum_enum_adding_default_when_encoded_value_specified.yml
│ │ │ ├── expected_enumeratum_enum_collection_component.yml
│ │ │ ├── expected_enumeratum_enum_component.yml
│ │ │ ├── expected_enumeratum_enum_default.yml
│ │ │ ├── expected_enumeratum_enum_not_adding_default_when_no_encoded_value_specified.yml
│ │ │ ├── expected_enumeratum_enum_using_first_specified_default_value.yml
│ │ │ ├── expected_enumeratum_int_enum_component.yml
│ │ │ └── expected_trait_enum_component.yml
│ │ ├── example
│ │ │ ├── expected_byte_buffer_example.yml
│ │ │ ├── expected_examples_of_list_and_not_list_types.yml
│ │ │ ├── expected_fixed_header_example.yml
│ │ │ ├── expected_multiple_examples.yml
│ │ │ ├── expected_multiple_examples_with_default_names.yml
│ │ │ ├── expected_multiple_examples_with_explicit_and_default_names.yml
│ │ │ ├── expected_multiple_examples_with_names.yml
│ │ │ ├── expected_schema_example.yml
│ │ │ ├── expected_schema_example_multiple_value.yml
│ │ │ ├── expected_single_example_with_description.yml
│ │ │ ├── expected_single_example_with_name.yml
│ │ │ ├── expected_single_example_with_summary.yml
│ │ │ └── expected_stream_example.yml
│ │ ├── expected.json
│ │ ├── expected.yml
│ │ ├── expected_additional_properties.yml
│ │ ├── expected_arbitrary_json_output.yml
│ │ ├── expected_array_no_format.yml
│ │ ├── expected_callbacks.yml
│ │ ├── expected_custom_operation_id.yml
│ │ ├── expected_custom_schema_name.yml
│ │ ├── expected_date_time.yml
│ │ ├── expected_default_and_example_on_nested_option_field.yml
│ │ ├── expected_default_query_param.yml
│ │ ├── expected_default_request_body.yml
│ │ ├── expected_deprecated.yml
│ │ ├── expected_descriptions_in_nested_custom_schemas.yml
│ │ ├── expected_double_quoted.yml
│ │ ├── expected_empty.yml
│ │ ├── expected_enumeration_values.yml
│ │ ├── expected_exclusive_bounds.yml
│ │ ├── expected_explicit_content_type_header.yml
│ │ ├── expected_extensions.yml
│ │ ├── expected_extensions_schema.yml
│ │ ├── expected_extensions_security_scheme.yml
│ │ ├── expected_external.yml
│ │ ├── expected_fields_with_additional_properties.yml
│ │ ├── expected_fixed_header_input_request.yml
│ │ ├── expected_fixed_header_output_response.yml
│ │ ├── expected_fixed_status_code.yml
│ │ ├── expected_fixed_status_code_2.yml
│ │ ├── expected_flag_query.yml
│ │ ├── expected_full_schema_names.yml
│ │ ├── expected_general_info.yml
│ │ ├── expected_generic.yml
│ │ ├── expected_json_query_param.yml
│ │ ├── expected_literal.yml
│ │ ├── expected_localDateTime.yml
│ │ ├── expected_map_with_plain_values.yml
│ │ ├── expected_multi_empty_outputs.yml
│ │ ├── expected_multipart.yml
│ │ ├── expected_multiple.yml
│ │ ├── expected_multiple_servers.yml
│ │ ├── expected_nullable_option_class_field.yml
│ │ ├── expected_nullable_option_class_field_303.yml
│ │ ├── expected_nullable_option_field.yml
│ │ ├── expected_nullable_option_field_303.yml
│ │ ├── expected_optional_header.yml
│ │ ├── expected_prepended_input.yml
│ │ ├── expected_recursive.yml
│ │ ├── expected_same_fullnames.yml
│ │ ├── expected_single_server_with_variables.yml
│ │ ├── expected_streaming.yml
│ │ ├── expected_string_body_response.yml
│ │ ├── expected_tags.yml
│ │ ├── expected_type_and_description_for_circe_json.yml
│ │ ├── expected_unfolded_array.yml
│ │ ├── expected_unfolded_array_unfolded_object.yml
│ │ ├── expected_unfolded_array_with_unique_items.yml
│ │ ├── expected_unfolded_hierarchy.yml
│ │ ├── expected_unfolded_object_unfolded_array.yml
│ │ ├── expected_unfolded_option.yml
│ │ ├── expected_unfolded_option_description.yml
│ │ ├── expected_unique_open_api_parameters.yml
│ │ ├── hide_in_docs.yml
│ │ ├── multi_customise_schema
│ │ │ ├── expected_deprecated_array_field.yml
│ │ │ ├── expected_deprecated_optional_field.yml
│ │ │ ├── inlined.yml
│ │ │ ├── nested_body.yml
│ │ │ └── top_level_body.yml
│ │ ├── oneOf
│ │ │ ├── expected_multiple_media_types_common_schema.yml
│ │ │ ├── expected_multiple_media_types_different_schema.yml
│ │ │ ├── expected_one_of_status_code_range.yml
│ │ │ ├── expected_one_of_status_codes.yml
│ │ │ ├── expected_status_codes.yml
│ │ │ ├── expected_status_codes_with_empty_output.yaml
│ │ │ ├── expected_the_same_status_codes.yml
│ │ │ └── expected_the_same_status_codes_and_content_types.yml
│ │ ├── oneOfBody
│ │ │ ├── expected_in_json_text_range.yml
│ │ │ ├── expected_in_json_xml_hidden.yml
│ │ │ ├── expected_in_json_xml_text.yml
│ │ │ └── expected_out_json_xml_text.yml
│ │ ├── security
│ │ │ ├── expected_auth.yml
│ │ │ ├── expected_auth_with_bearer_format.yml
│ │ │ ├── expected_auth_with_description.yml
│ │ │ ├── expected_auth_with_named_schemes.yml
│ │ │ ├── expected_hide_security_body.yml
│ │ │ ├── expected_multiple_optional_auth.yml
│ │ │ ├── expected_multiple_optional_auth_oauth2.yml
│ │ │ ├── expected_multiple_optional_grouped_auth.yml
│ │ │ ├── expected_oauth2.yml
│ │ │ └── expected_optional_auth.yml
│ │ └── validator
│ │ │ ├── expected_valid_additional_properties.yml
│ │ │ ├── expected_valid_body_collection.yml
│ │ │ ├── expected_valid_body_enum.yml
│ │ │ ├── expected_valid_body_wrapped.yml
│ │ │ ├── expected_valid_coproduct.yml
│ │ │ ├── expected_valid_enum_cats_nel.yml
│ │ │ ├── expected_valid_enum_class.yml
│ │ │ ├── expected_valid_enum_class_wrapped_in_option.yml
│ │ │ ├── expected_valid_enum_object.yml
│ │ │ ├── expected_valid_enum_values.yml
│ │ │ ├── expected_valid_enumeratum.yml
│ │ │ ├── expected_valid_enumeratum_with_metadata.yml
│ │ │ ├── expected_valid_int_array.yml
│ │ │ ├── expected_valid_modified_array_objects.yml
│ │ │ ├── expected_valid_modified_array_strings.yml
│ │ │ ├── expected_valid_optional_body_wrapped.yml
│ │ │ ├── expected_valid_optional_coproduct.yml
│ │ │ ├── expected_valid_query_tagged.yml
│ │ │ ├── expected_valid_query_wrapped.yml
│ │ │ ├── expected_validator_encode_from_codec.yml
│ │ │ ├── expected_validator_infer_encode_to_raw.yml
│ │ │ ├── expected_validator_with_custom_naming.yml
│ │ │ └── expected_whole_numbers_in_examples_of_string_schemas.yml
│ │ ├── scalajvm-2
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── docs
│ │ │ └── openapi
│ │ │ ├── VerifyYamlEnumeratumTest.scala
│ │ │ └── dtos
│ │ │ ├── VerifyYamlCoproductTestData2.scala
│ │ │ └── VerifyYamlTestData2.scala
│ │ ├── scalajvm-3-2.13+
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── docs
│ │ │ └── openapi
│ │ │ └── VerifyYamlEnumerationTest.scala
│ │ ├── scalajvm-3
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── docs
│ │ │ └── openapi
│ │ │ └── dtos
│ │ │ ├── VerifyYamlCoproductTestData2.scala
│ │ │ └── VerifyYamlTestData2.scala
│ │ └── scalajvm
│ │ └── sttp
│ │ └── tapir
│ │ └── docs
│ │ └── openapi
│ │ ├── EndpointToOpenAPIDocsTest.scala
│ │ ├── VerifyJsonTest.scala
│ │ ├── VerifyYamlCoproductTest.scala
│ │ ├── VerifyYamlDecodeFailureOutputTest.scala
│ │ ├── VerifyYamlExampleTest.scala
│ │ ├── VerifyYamlMultiCustomiseSchemaTest.scala
│ │ ├── VerifyYamlOneOfBodyTest.scala
│ │ ├── VerifyYamlOneOfTest.scala
│ │ ├── VerifyYamlSecurityTest.scala
│ │ ├── VerifyYamlTest.scala
│ │ ├── VerifyYamlValidatorTest.scala
│ │ ├── dtos
│ │ ├── Book.scala
│ │ ├── VerifyYamlCoproductTestData.scala
│ │ ├── VerifyYamlTestData.scala
│ │ ├── VerifyYamlValidatorTestData.scala
│ │ ├── a
│ │ │ └── Pet.scala
│ │ └── b
│ │ │ └── Pet.scala
│ │ └── package.scala
├── openapi-verifier
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── docs
│ │ │ └── openapi
│ │ │ └── OpenAPIVerifier.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── docs
│ │ └── openapi
│ │ └── OpenApiVerifierTest.scala
├── redoc-bundle
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── redoc
│ │ │ └── bundle
│ │ │ └── RedocInterpreter.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── redoc
│ │ └── bundle
│ │ └── RedocInterpreterTest.scala
├── redoc
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── redoc
│ │ ├── Redoc.scala
│ │ └── RedocUIOptions.scala
├── swagger-ui-bundle
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── swagger
│ │ │ └── bundle
│ │ │ └── SwaggerInterpreter.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── swagger
│ │ └── bundle
│ │ └── SwaggerInterpreterTest.scala
└── swagger-ui
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── swagger
│ │ ├── SwaggerUI.scala
│ │ └── SwaggerUIOptions.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── swagger
│ └── SwaggerUITest.scala
├── examples
└── src
│ └── main
│ ├── resources
│ ├── logback.xml
│ └── webapp
│ │ ├── img
│ │ └── logo.png
│ │ └── index.html
│ └── scala
│ └── sttp
│ └── tapir
│ └── examples
│ ├── HelloWorldHttp4sServer.scala
│ ├── HelloWorldNettyCatsServer.scala
│ ├── HelloWorldZioHttpServer.scala
│ ├── ZioEnvExampleHttp4sServer.scala
│ ├── ZioExampleHttp4sServer.scala
│ ├── ZioExampleZioHttpServer.scala
│ ├── ZioPartialServerLogicHttp4s.scala
│ ├── booksExample.scala
│ ├── booksPicklerExample.scala
│ ├── client
│ └── Http4sClientExample.scala
│ ├── custom_types
│ ├── EndpointWithCustomTypes.scala
│ ├── booksExampleSemiauto.scala
│ ├── commaSeparatedQueryParameter.scala
│ ├── enumQueryParameter.scala
│ └── sealedTraitWithDiscriminator.scala
│ ├── errors
│ ├── ErrorUnionTypesHttp4sServer.scala
│ ├── customErrorsOnDecodeFailurePekkoServer.scala
│ ├── errorAsJson.scala
│ ├── errorOutputsPekkoServer.scala
│ └── optionalValueExample.scala
│ ├── helloWorldArmeriaServer.scala
│ ├── helloWorldJdkHttpServer.scala
│ ├── helloWorldNettyFutureServer.scala
│ ├── helloWorldNettySyncServer.scala
│ ├── helloWorldPekkoServer.scala
│ ├── json
│ ├── circeAutoDerivationNettySyncServer.scala
│ ├── circeNullBody.scala
│ └── jsoniterNettySyncServer.scala
│ ├── logging
│ └── ZioLoggingWithCorrelationIdNettyServer.scala
│ ├── multipart
│ └── multipartFormUploadPekkoServer.scala
│ ├── observability
│ ├── OpenTelemetryTracingExample.scala
│ ├── Otel4sTracingExample.scala
│ ├── ZioMetricsExample.scala
│ ├── datadogMetricsExample.scala
│ ├── openTelemetryMetricsExample.scala
│ └── prometheusMetricsExample.scala
│ ├── openapi
│ ├── MultipleEndpointsDocumentationHttp4sServer.scala
│ ├── RedocContextPathHttp4sServer.scala
│ ├── RedocZioHttpServer.scala
│ ├── multipleEndpointsDocumentationPekkoServer.scala
│ ├── openapiExtensions.scala
│ └── swaggerUIOAuth2PekkoServer.scala
│ ├── schema
│ └── customisingSchemas.scala
│ ├── security
│ ├── OAuth2GithubHttp4sServer.scala
│ ├── ServerSecurityLogicZio.scala
│ ├── basicAuthenticationPekkoServer.scala
│ ├── corsInterceptorPekkoServer.scala
│ ├── corsInterceptorVertxServer.scala
│ ├── csrfTokens.scala
│ ├── externalSecurityInterceptor.scala
│ ├── serverSecurityLogicPekko.scala
│ └── serverSecurityLogicRefreshCookiesPekko.scala
│ ├── sse
│ └── sseNettySyncServer.scala
│ ├── static_content
│ ├── staticContentFromFilesNettyServer.scala
│ ├── staticContentFromFilesPekkoServer.scala
│ ├── staticContentFromResourcesPekkoServer.scala
│ └── staticContentSecurePekkoServer.scala
│ ├── status_code
│ └── statusCodeNettyServer.scala
│ ├── streaming
│ ├── ProxyHttp4sFs2Server.scala
│ ├── StreamingHttp4sFs2Server.scala
│ ├── StreamingHttp4sFs2ServerOrError.scala
│ ├── StreamingNettyFs2Server.scala
│ ├── StreamingNettyZioServer.scala
│ ├── StreamingZioHttpServer.scala
│ └── streamingPekkoServer.scala
│ ├── testing
│ ├── CatsServerStubInterpreter.scala
│ ├── PekkoServerStubInterpreter.scala
│ └── SttpMockServerClientExample.scala
│ └── websocket
│ ├── WebSocketChatNettySyncServer.scala
│ ├── WebSocketHttp4sServer.scala
│ ├── WebSocketNettySyncServer.scala
│ ├── WebSocketZioHttpCustomCodecServer.scala
│ ├── WebSocketZioHttpJsonServer.scala
│ └── webSocketPekkoServer.scala
├── files
└── src
│ ├── main
│ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── files
│ │ │ └── TapirStaticContentEndpoints.scala
│ ├── scalajvm
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── files
│ │ │ ├── Files.scala
│ │ │ ├── Resources.scala
│ │ │ ├── TapirStaticContentEndpoints.scala
│ │ │ ├── model.scala
│ │ │ └── package.scala
│ └── scalanative
│ │ └── sttp
│ │ └── tapir
│ │ └── files
│ │ └── TapirStaticContentEndpoints.scala
│ └── test
│ └── scalajvm
│ └── sttp
│ └── tapir
│ └── FilesSpec.scala
├── generated-doc
└── out
│ ├── .gitignore
│ ├── .python-version
│ ├── Makefile
│ ├── _static
│ └── css
│ │ └── custom.css
│ ├── adopters.md
│ ├── adopters
│ ├── adobe.png
│ ├── broad.png
│ ├── budgetbakers.svg
│ ├── carvana.svg
│ ├── colisweb.png
│ ├── dpg-recruitment.svg
│ ├── ematiq.png
│ ├── flo.svg
│ ├── fugo.png
│ ├── hootsuite.png
│ ├── hunters.png
│ ├── iceo.png
│ ├── kaizo.png
│ ├── kelkoogroup.png
│ ├── kensu.png
│ ├── moia.png
│ ├── moneyfarm.png
│ ├── ocado.png
│ ├── pits.svg
│ ├── process_street.png
│ ├── softwaremill.png
│ ├── swissborg.png
│ ├── swisscom.svg
│ ├── tranzzo.svg
│ └── wegtam.svg
│ ├── adr
│ ├── 0001-explicit-encode-function-on-validator-enum.md
│ ├── 0002-codecs-schemas-validators.md
│ ├── 0003-shape-of-ios.md
│ ├── 0004-codecs-parametrised-by-raw-values.md
│ ├── 0005-rethinking-codecs.md
│ ├── 0006-partial-server-logic.md
│ ├── 0007-codecs-schemas-configuration.md
│ ├── 0008-effectful-maps.md
│ ├── 0009-lists-are-optional.md
│ ├── 0010-security-refactoring.md
│ ├── 0011-dedicated-schema-macros.md
│ └── 0012-extracting-schema-as-a-module.md
│ ├── client
│ ├── http4s.md
│ ├── play.md
│ ├── sttp.md
│ └── sttp4.md
│ ├── conf.py
│ ├── docs
│ ├── asyncapi.md
│ ├── json-schema.md
│ └── openapi.md
│ ├── endpoint
│ ├── basics.md
│ ├── codecs.md
│ ├── contenttype.md
│ ├── customtypes.md
│ ├── enumerations.md
│ ├── forms.md
│ ├── integrations.md
│ ├── ios.md
│ ├── json.md
│ ├── oneof.md
│ ├── pickler.md
│ ├── schemas.md
│ ├── security.md
│ ├── static.md
│ ├── streaming.md
│ ├── validation.md
│ ├── websockets.md
│ └── xml.md
│ ├── examples.md
│ ├── external.md
│ ├── flake.lock
│ ├── flake.nix
│ ├── generate.md
│ ├── generator
│ └── sbt-openapi-codegen.md
│ ├── how-tos
│ └── delimited-path-parameters.md
│ ├── includes
│ └── examples_list.md
│ ├── index.md
│ ├── logo.png
│ ├── make.bat
│ ├── other
│ ├── adr.md
│ ├── contributing.md
│ ├── goals.md
│ ├── grpc.md
│ ├── migrating.md
│ ├── mytapir.md
│ ├── other_interpreters.md
│ ├── stability.md
│ └── troubleshooting.md
│ ├── press
│ └── tapir-1-0-released.md
│ ├── quickstart.md
│ ├── requirements.txt
│ ├── scala_2_3_platforms.md
│ ├── server
│ ├── akkahttp.md
│ ├── armeria.md
│ ├── aws.md
│ ├── debugging.md
│ ├── errors.md
│ ├── finatra.md
│ ├── http4s.md
│ ├── interceptors.md
│ ├── jdkhttp.md
│ ├── logic.md
│ ├── netty.md
│ ├── nima.md
│ ├── observability.md
│ ├── options.md
│ ├── overview.md
│ ├── path.md
│ ├── pekkohttp.md
│ ├── play.md
│ ├── vertx.md
│ ├── zio-http4s.md
│ └── ziohttp.md
│ ├── support.md
│ ├── testing.md
│ ├── tutorials
│ ├── 01_hello_world.md
│ ├── 02_openapi_docs.md
│ ├── 03_json.md
│ ├── 04_errors.md
│ ├── 05_multiple_inputs_outputs.md
│ ├── 06_error_variants.md
│ └── 07_cats_effect.md
│ └── watch.sh
├── grpc
├── examples
│ └── src
│ │ └── main
│ │ ├── protobuf
│ │ └── simple_books_example.proto
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── grpc
│ │ └── examples
│ │ └── GrpcSimpleBooksExample.scala
├── pbdirect
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── grpc
│ │ └── protobuf
│ │ └── pbdirect
│ │ ├── TapirProtobufPbDirect.scala
│ │ └── pbdirect.scala
├── pekko-examples
│ └── src
│ │ └── main
│ │ ├── protobuf
│ │ └── simple_books_example.proto
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── grpc
│ │ └── examples
│ │ └── PekkoGrpcSimpleBooksExample.scala
└── protobuf
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── grpc
│ │ └── protobuf
│ │ ├── EndpointToProtobufMessage.scala
│ │ ├── EndpointToProtobufService.scala
│ │ ├── ProtoRenderer.scala
│ │ ├── ProtoSchemaGenerator.scala
│ │ ├── ProtobufAttributes.scala
│ │ ├── ProtobufInterpreter.scala
│ │ ├── ProtobufScalarType.scala
│ │ ├── model
│ │ ├── Protobuf.scala
│ │ ├── ProtobufMessage.scala
│ │ ├── ProtobufMessageField.scala
│ │ ├── ProtobufOptions.scala
│ │ ├── ProtobufService.scala
│ │ ├── ProtobufServiceMethod.scala
│ │ └── package.scala
│ │ └── package.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── grpc
│ └── protobuf
│ ├── ProtoRendererTest.scala
│ ├── ProtobufInterpreterTest.scala
│ └── ProtobufMatchers.scala
├── integrations
├── cats-effect
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── integ
│ │ └── cats
│ │ └── effect
│ │ └── CatsMonadError.scala
├── cats
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── integ
│ │ │ └── cats
│ │ │ ├── EndpointIOInstances.scala
│ │ │ ├── ExampleInstances.scala
│ │ │ ├── ModifyFunctorInstances.scala
│ │ │ ├── MonadErrorSyntax.scala
│ │ │ ├── ServerEndpointSyntax.scala
│ │ │ ├── TapirCodecCats.scala
│ │ │ ├── ValidatorCats.scala
│ │ │ ├── codec.scala
│ │ │ ├── instances.scala
│ │ │ └── syntax.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── integ
│ │ └── cats
│ │ ├── EndpointIOInstancesSpec.scala
│ │ ├── ExampleFunctorLawSpec.scala
│ │ ├── ModifyFunctorInstancesTest.scala
│ │ ├── ModifyFunctorInstancesTestData.scala
│ │ ├── TapirCodecCatsTest.scala
│ │ └── ValidatorCatsTest.scala
├── derevo
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── derevo
│ │ │ └── schema.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── derevo
│ │ └── DerevoSchemaDerivationSpec.scala
├── enumeratum
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── enumeratum
│ │ │ ├── TapirCodecEnumeratum.scala
│ │ │ └── enumeratum.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── codec
│ │ └── enumeratum
│ │ └── TapirCodecEnumeratumTest.scala
├── iron
│ ├── examples
│ │ └── src
│ │ │ └── main
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── examples
│ │ │ └── errors
│ │ │ └── IronRefinementErrorsNettyServer.scala
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── iron
│ │ │ └── codec
│ │ │ └── iron
│ │ │ ├── IntersectionTypeMirror.scala
│ │ │ ├── TapirCodecIron.scala
│ │ │ ├── UnionTypeMirror.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala-3
│ │ ├── com
│ │ └── example
│ │ │ └── RefinedString.scala
│ │ └── sttp
│ │ └── iron
│ │ └── codec
│ │ └── iron
│ │ ├── RefinedInt.scala
│ │ └── TapirCodecIronTestScala3.scala
├── monix-newtype
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── monix
│ │ │ └── newtype
│ │ │ ├── TapirCodecMonixNewType.scala
│ │ │ └── newtype.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── codec
│ │ └── monix
│ │ └── newtype
│ │ └── TapirCodecMonixNewTypeTest.scala
├── newtype
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── newtype
│ │ │ ├── TapirCodecNewType.scala
│ │ │ └── newtype.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── codec
│ │ └── newtype
│ │ └── TapirCodecNewTypeTest.scala
├── refined
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── refined
│ │ │ ├── TapirCodecRefined.scala
│ │ │ └── package.scala
│ │ └── test
│ │ ├── scala-2
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── refined
│ │ │ └── TapirCodecRefinedTestScala2.scala
│ │ ├── scala-3
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── refined
│ │ │ └── TapirCodecRefinedTestScala3.scala
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── codec
│ │ └── refined
│ │ └── TapirCodecRefinedTest.scala
├── zio-prelude
│ └── src
│ │ ├── main
│ │ ├── scala-2
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── codec
│ │ │ │ └── zio
│ │ │ │ └── prelude
│ │ │ │ └── newtype
│ │ │ │ ├── TapirNewtype.scala
│ │ │ │ └── TapirNewtypeSupport.scala
│ │ └── scala-3
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── zio
│ │ │ └── prelude
│ │ │ └── newtype
│ │ │ ├── TapirNewtype.scala
│ │ │ └── TapirNewtypeSupport.scala
│ │ └── test
│ │ ├── scala-2
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── zio
│ │ │ └── prelude
│ │ │ └── newtype
│ │ │ ├── TapirNewtypeSupportTestFixture.scala
│ │ │ └── TapirNewtypeTestFixture.scala
│ │ ├── scala-3
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codec
│ │ │ └── zio
│ │ │ └── prelude
│ │ │ └── newtype
│ │ │ ├── PalindromeValidator.scala
│ │ │ ├── TapirNewtypeCustomSupportTest.scala
│ │ │ ├── TapirNewtypeCustomTest.scala
│ │ │ ├── TapirNewtypeSupportTestFixture.scala
│ │ │ └── TapirNewtypeTestFixture.scala
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── codec
│ │ └── zio
│ │ └── prelude
│ │ └── newtype
│ │ ├── TapirNewtypeSupportTest.scala
│ │ └── TapirNewtypeTest.scala
└── zio
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── ztapir
│ │ ├── RIOMonadError.scala
│ │ ├── ZPartialServerEndpoint.scala
│ │ ├── ZTapir.scala
│ │ ├── ZioServerSentEvents.scala
│ │ └── package.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── ztapir
│ ├── TestError.scala
│ ├── ZTapirTest.scala
│ ├── ZioServerSentEventsTest.scala
│ └── instances
│ └── TestMonadError.scala
├── json
├── circe
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── circe
│ │ │ ├── TapirJsonCirce.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scalajvm
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── circe
│ │ └── TapirJsonCirceTests.scala
├── json4s
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── json4s
│ │ │ ├── TapirJson4s.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala-2
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── json4s
│ │ └── TapirJson4sTests.scala
├── jsoniter
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── jsoniter
│ │ │ ├── TapirJsonJsoniter.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── jsoniter
│ │ └── TapirJsonJsoniterTests.scala
├── pickler
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── pickler
│ │ │ ├── CreateDerivedEnumerationPickler.scala
│ │ │ ├── Pickler.scala
│ │ │ ├── PicklerConfiguration.scala
│ │ │ ├── Readers.scala
│ │ │ ├── SchemaDerivation.scala
│ │ │ ├── SubtypeDiscriminator.scala
│ │ │ ├── TapirPickle.scala
│ │ │ ├── UpickleHelpers.scala
│ │ │ ├── Writers.scala
│ │ │ ├── generic.scala
│ │ │ ├── macros.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── pickler
│ │ ├── Fixtures.scala
│ │ ├── PicklerBasicTest.scala
│ │ ├── PicklerCoproductTest.scala
│ │ ├── PicklerCustomizationTest.scala
│ │ ├── PicklerEnumTest.scala
│ │ └── SchemaDerivationTest.scala
├── playjson
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── play
│ │ │ ├── TapirJsonPlay.scala
│ │ │ └── package.scala
│ │ └── test
│ │ ├── scala
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── play
│ │ │ └── TapirJsonPlayTests.scala
│ │ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── play
│ │ │ └── TapirJsonPlayTestExtensions.scala
│ │ └── scalajvm
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── play
│ │ └── TapirJsonPlayTestExtensions.scala
├── sprayjson
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── spray
│ │ │ ├── TapirJsonSpray.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── spray
│ │ └── TapirJsonSprayTests.scala
├── tethys
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── tethys
│ │ │ ├── TapirJsonTethys.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── tethys
│ │ └── TapirJsonTethysTests.scala
├── upickle
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── upickle
│ │ │ ├── TapirJsonuPickle.scala
│ │ │ └── package.scala
│ │ └── test
│ │ ├── scala
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── upickle
│ │ │ └── TapirJsonuPickleTests.scala
│ │ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── upickle
│ │ │ └── TapirJsonuPickleTestExtensions.scala
│ │ ├── scalajvm
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── json
│ │ │ └── upickle
│ │ │ └── TapirJsonuPickleTestExtensions.scala
│ │ └── scalanative
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── upickle
│ │ └── TapirJsonuPickleTestExtensions.scala
└── zio
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── json
│ │ └── zio
│ │ ├── TapirJsonZio.scala
│ │ └── package.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── json
│ └── zio
│ └── TapirJsonZioTest.scala
├── metrics
├── datadog-metrics
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── metrics
│ │ │ └── datadog
│ │ │ └── DatadogMetrics.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── metrics
│ │ └── datadog
│ │ └── DatadogMetricsTest.scala
├── opentelemetry-metrics
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── metrics
│ │ │ └── opentelemetry
│ │ │ └── OpenTelemetryMetrics.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── metrics
│ │ └── opentelemetry
│ │ └── OpenTelemetryMetricsTest.scala
├── prometheus-metrics
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── metrics
│ │ │ └── prometheus
│ │ │ └── PrometheusMetrics.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── metrics
│ │ └── prometheus
│ │ └── PrometheusMetricsTest.scala
└── zio-metrics
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── metrics
│ │ └── zio
│ │ └── ZioMetrics.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── server
│ └── metrics
│ └── zio
│ └── ZioMetricsTest.scala
├── openapi-codegen
├── cli
│ ├── src
│ │ └── main
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codegen
│ │ │ ├── GenScala.scala
│ │ │ └── Main.scala
│ └── tapir-codegen.json
├── core
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── codegen
│ │ │ ├── ClassDefinitionGenerator.scala
│ │ │ ├── EndpointGenerator.scala
│ │ │ ├── EnumGenerator.scala
│ │ │ ├── JsonSerdeGenerator.scala
│ │ │ ├── RootGenerator.scala
│ │ │ ├── SchemaGenerator.scala
│ │ │ ├── SecurityGenerator.scala
│ │ │ ├── ServersGenerator.scala
│ │ │ ├── ValidationGenerator.scala
│ │ │ ├── XmlSerdeGenerator.scala
│ │ │ ├── YamlParser.scala
│ │ │ ├── openapi
│ │ │ └── models
│ │ │ │ ├── DefaultValueRenderer.scala
│ │ │ │ ├── GenerationDirectives.scala
│ │ │ │ ├── OpenapiComponent.scala
│ │ │ │ ├── OpenapiModels.scala
│ │ │ │ ├── OpenapiReqResp.scala
│ │ │ │ ├── OpenapiSchemaType.scala
│ │ │ │ ├── OpenapiSecuritySchemeType.scala
│ │ │ │ ├── OpenapiServer.scala
│ │ │ │ ├── OpenapiXml.scala
│ │ │ │ └── SpecificationExtensionRenderer.scala
│ │ │ └── util
│ │ │ ├── DocUtils.scala
│ │ │ ├── ErrUtils.scala
│ │ │ ├── MapUtils.scala
│ │ │ └── StringUtils.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── codegen
│ │ ├── ClassDefinitionGeneratorSpec.scala
│ │ ├── EndpointGeneratorSpec.scala
│ │ ├── RootGeneratorSpec.scala
│ │ ├── TestHelpers.scala
│ │ ├── models
│ │ ├── ModelParserSpec.scala
│ │ └── SchemaParserSpec.scala
│ │ └── testutils
│ │ ├── CompileCheckTestBase.scala
│ │ └── CompileCheckTestBaseSpec.scala
└── sbt-plugin
│ ├── README.md
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── sbt
│ │ ├── OpenapiCodegenKeys.scala
│ │ ├── OpenapiCodegenPlugin.scala
│ │ └── OpenapiCodegenTask.scala
│ └── sbt-test
│ └── sbt-openapi-codegen
│ ├── caching
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ └── main
│ │ │ └── scala
│ │ │ └── Main.scala
│ ├── swagger.yaml
│ └── test
│ ├── minimal
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ └── main
│ │ │ └── scala
│ │ │ └── Main.scala
│ ├── swagger.yaml
│ └── test
│ ├── multi_file
│ ├── Expected.scala.txt
│ ├── Expected2.scala.txt
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ └── main
│ │ │ └── scala
│ │ │ └── Main.scala
│ ├── swagger.yaml
│ ├── swagger2.yaml
│ └── test
│ ├── oneOf-json-roundtrip-zio
│ ├── Expected.scala.txt
│ ├── ExpectedJsonSerdes.scala.txt
│ ├── ExpectedSchemas.scala.txt
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── Main.scala
│ │ └── test
│ │ │ └── scala
│ │ │ └── JsonRoundtrip.scala
│ ├── swagger.yaml
│ └── test
│ ├── oneOf-json-roundtrip
│ ├── Expected.scala.txt
│ ├── ExpectedJsonSerdes.scala.txt
│ ├── ExpectedSchemas.scala.txt
│ ├── ExpectedValidators.scala.txt
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── Main.scala
│ │ └── test
│ │ │ └── scala
│ │ │ ├── BinaryEndpoints.scala
│ │ │ ├── JsonRoundtrip.scala
│ │ │ ├── ServerSpec.scala
│ │ │ └── ValidationSpec.scala
│ ├── swagger.yaml
│ └── test
│ ├── oneOf-json-roundtrip_jsoniter
│ ├── Expected.scala.txt
│ ├── ExpectedJsonSerdes.scala.txt
│ ├── ExpectedXmlSerdes.scala.txt
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── Main.scala
│ │ └── test
│ │ │ └── scala
│ │ │ ├── BinaryEndpoints.scala
│ │ │ ├── JsonRoundtrip.scala
│ │ │ └── XmlRoundtrip.scala
│ ├── swagger.yaml
│ └── test
│ ├── oneOf-json-roundtrip_jsoniter_scala3
│ ├── Expected.scala.txt
│ ├── ExpectedJsonSerdes.scala.txt
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── Main.scala
│ │ └── test
│ │ │ └── scala
│ │ │ └── JsonRoundtrip.scala
│ ├── swagger.yaml
│ └── test
│ ├── oneOf-json-roundtrip_scala3
│ ├── Expected.scala.txt
│ ├── build.sbt
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── Main.scala
│ │ └── test
│ │ │ └── scala
│ │ │ ├── JsonRoundtrip.scala
│ │ │ └── ServerSpec.scala
│ ├── swagger.yaml
│ └── test
│ ├── option-overrides
│ ├── build.sbt
│ ├── example_swagger.yaml
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── src
│ │ └── main
│ │ │ └── scala
│ │ │ └── Main.scala
│ └── test
│ └── petstore
│ ├── Expected.scala.txt
│ ├── ExpectedJsonSerdes.scala.txt
│ ├── ExpectedSchemas.scala.txt
│ ├── ExpectedXmlSerdes.scala.txt
│ ├── build.sbt
│ ├── project
│ ├── build.properties
│ └── plugins.sbt
│ ├── src
│ ├── main
│ │ └── scala
│ │ │ └── Main.scala
│ └── test
│ │ └── scala
│ │ └── XmlRoundtrip.scala
│ ├── swagger.yaml
│ └── test
├── perf-tests
├── README.md
├── results
│ ├── 100users-1min-18-03-2022-local-adamw.md
│ ├── 100users-5min-09-03-2022-ec2.md
│ └── 100users-5min-09-03-2022-local.md
└── src
│ ├── main
│ ├── resources
│ │ ├── 64KB.json
│ │ └── logback.xml
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── perf
│ │ ├── Common.scala
│ │ ├── apis
│ │ ├── Endpoints.scala
│ │ ├── ServerName.scala
│ │ ├── ServerRunner.scala
│ │ └── TypeScanner.scala
│ │ ├── http4s
│ │ └── Http4s.scala
│ │ ├── netty
│ │ ├── cats
│ │ │ └── NettyCats.scala
│ │ └── future
│ │ │ └── NettyFuture.scala
│ │ ├── nima
│ │ └── Nima.scala
│ │ ├── pekko
│ │ └── PekkoHttp.scala
│ │ ├── play
│ │ └── Play.scala
│ │ └── vertx
│ │ ├── Vertx.scala
│ │ └── cats
│ │ └── VertxCats.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── perf
│ ├── HistogramPrinter.scala
│ └── Simulations.scala
├── project
├── FileUtils.scala
├── GenerateListOfExamples.scala
├── GenerateMimeByExtensionDB.scala
├── PollingUtils.scala
├── VerifyExamplesCompileUsingScalaCli.scala
├── Versions.scala
├── build.properties
├── build.sbt
└── plugins.sbt
├── server
├── akka-grpc-server
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── akkagrpc
│ │ ├── AkkaGrpcRequestBody.scala
│ │ ├── AkkaGrpcServerInterpreter.scala
│ │ └── AkkaGrpcToResponseBody.scala
├── akka-http-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── akkahttp
│ │ │ ├── AkkaBodyListener.scala
│ │ │ ├── AkkaHttpServerInterpreter.scala
│ │ │ ├── AkkaHttpServerOptions.scala
│ │ │ ├── AkkaModel.scala
│ │ │ ├── AkkaRequestBody.scala
│ │ │ ├── AkkaServerRequest.scala
│ │ │ ├── AkkaServerSentEvents.scala
│ │ │ ├── AkkaStreamSizeExceptionInterceptor.scala
│ │ │ ├── AkkaToResponseBody.scala
│ │ │ ├── AkkaWebSockets.scala
│ │ │ ├── ContentTypeCache.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── akkahttp
│ │ ├── AkkaHttpServerStubTest.scala
│ │ ├── AkkaHttpServerTest.scala
│ │ ├── AkkaHttpTestServerInterpreter.scala
│ │ └── AkkaServerSentEventsTest.scala
├── armeria-server
│ ├── cats
│ │ └── src
│ │ │ ├── main
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── armeria
│ │ │ │ └── cats
│ │ │ │ ├── ArmeriaCatsServerInterpreter.scala
│ │ │ │ ├── ArmeriaCatsServerOptions.scala
│ │ │ │ ├── CatsMonadAsyncError.scala
│ │ │ │ └── TapirCatsService.scala
│ │ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── armeria
│ │ │ └── cats
│ │ │ ├── ArmeriaCatsServerTest.scala
│ │ │ └── ArmeriaCatsTestServerInterpreter.scala
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── armeria
│ │ │ │ ├── ArmeriaBodyListener.scala
│ │ │ │ ├── ArmeriaFutureServerInterpreter.scala
│ │ │ │ ├── ArmeriaFutureServerOptions.scala
│ │ │ │ ├── ArmeriaRequestBody.scala
│ │ │ │ ├── ArmeriaServerOptions.scala
│ │ │ │ ├── ArmeriaServerRequest.scala
│ │ │ │ ├── ArmeriaToResponseBody.scala
│ │ │ │ ├── FutureConversion.scala
│ │ │ │ ├── HeaderMapping.scala
│ │ │ │ ├── MethodMapping.scala
│ │ │ │ ├── ResultMapping.scala
│ │ │ │ ├── RouteMapping.scala
│ │ │ │ ├── StreamCompatible.scala
│ │ │ │ ├── TapirFutureService.scala
│ │ │ │ ├── TapirService.scala
│ │ │ │ └── package.scala
│ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── armeria
│ │ │ ├── ArmeriaFutureServerTest.scala
│ │ │ ├── ArmeriaTestFutureServerInterpreter.scala
│ │ │ ├── ArmeriaTestServerInterpreter.scala
│ │ │ └── RouteMappingTest.scala
│ └── zio
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── armeria
│ │ │ └── zio
│ │ │ ├── ArmeriaZioServerInterpreter.scala
│ │ │ ├── ArmeriaZioServerOptions.scala
│ │ │ ├── RIOMonadAsyncError.scala
│ │ │ └── TapirZioService.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── armeria
│ │ └── zio
│ │ ├── ArmeriaZioServerTest.scala
│ │ └── ArmeriaZioTestServerInterpreter.scala
├── core
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ ├── interceptor
│ │ │ ├── CustomiseInterceptors.scala
│ │ │ ├── DecodeFailureContext.scala
│ │ │ ├── DecodeSuccessContext.scala
│ │ │ ├── EndpointHandler.scala
│ │ │ ├── Interceptor.scala
│ │ │ ├── RequestHandler.scala
│ │ │ ├── RequestResult.scala
│ │ │ ├── SecurityFailureContext.scala
│ │ │ ├── content
│ │ │ │ └── NotAcceptableInterceptor.scala
│ │ │ ├── cors
│ │ │ │ ├── CORSConfig.scala
│ │ │ │ └── CORSInterceptor.scala
│ │ │ ├── decodefailure
│ │ │ │ ├── DecodeFailureHandler.scala
│ │ │ │ └── DecodeFailureInterceptor.scala
│ │ │ ├── exception
│ │ │ │ ├── ExceptionContext.scala
│ │ │ │ ├── ExceptionHandler.scala
│ │ │ │ └── ExceptionInterceptor.scala
│ │ │ ├── log
│ │ │ │ ├── ExceptionContext.scala
│ │ │ │ ├── ServerLog.scala
│ │ │ │ └── ServerLogInterceptor.scala
│ │ │ ├── metrics
│ │ │ │ └── MetricsEndpointInterceptor.scala
│ │ │ └── reject
│ │ │ │ ├── RejectContext.scala
│ │ │ │ ├── RejectHandler.scala
│ │ │ │ └── RejectInterceptor.scala
│ │ │ ├── interpreter
│ │ │ ├── BodyListener.scala
│ │ │ ├── DecodeBasicInputs.scala
│ │ │ ├── EncodeOutputs.scala
│ │ │ ├── FilterServerEndpoints.scala
│ │ │ ├── InputValue.scala
│ │ │ ├── RequestBody.scala
│ │ │ ├── ServerInterpreter.scala
│ │ │ └── ToResponseBody.scala
│ │ │ ├── metrics
│ │ │ └── Metric.scala
│ │ │ └── model
│ │ │ ├── EndpointExtensions.scala
│ │ │ ├── ServerResponse.scala
│ │ │ └── ValuedEndpointOutput.scala
│ │ └── test
│ │ ├── scala
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ ├── TestUtil.scala
│ │ │ ├── interceptor
│ │ │ ├── cors
│ │ │ │ ├── CORSConfigTest.scala
│ │ │ │ └── CORSInterceptorTest.scala
│ │ │ └── decodefailure
│ │ │ │ └── DefaultDecodeFailureHandlerTest.scala
│ │ │ └── interpreter
│ │ │ ├── DecodeBasicInputsTest.scala
│ │ │ ├── FilterServerEndpointsTest.scala
│ │ │ └── ServerInterpreterTest.scala
│ │ └── scalajvm
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── interpreter
│ │ └── DecodeBasicInputsResultTest.scala
├── finatra-server
│ ├── cats
│ │ └── src
│ │ │ ├── main
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── finatra
│ │ │ │ └── cats
│ │ │ │ ├── FinatraCatsServerInterpreter.scala
│ │ │ │ ├── FinatraCatsServerOptions.scala
│ │ │ │ └── conversions.scala
│ │ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── finatra
│ │ │ └── cats
│ │ │ ├── FinatraCatsTestServerInterpreter.scala
│ │ │ └── FinatraServerCatsTests.scala
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── finatra
│ │ │ ├── FileChunk.scala
│ │ │ ├── FinatraBodyListener.scala
│ │ │ ├── FinatraContent.scala
│ │ │ ├── FinatraRequestBody.scala
│ │ │ ├── FinatraRoute.scala
│ │ │ ├── FinatraServerInterpreter.scala
│ │ │ ├── FinatraServerOptions.scala
│ │ │ ├── FinatraServerRequest.scala
│ │ │ ├── FinatraToResponseBody.scala
│ │ │ └── TapirController.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── finatra
│ │ ├── FinatraServerStubTest.scala
│ │ ├── FinatraServerTest.scala
│ │ └── FinatraTestServerInterpreter.scala
├── http4s-server
│ ├── src
│ │ ├── main
│ │ │ ├── scala
│ │ │ │ └── sttp
│ │ │ │ │ └── tapir
│ │ │ │ │ └── server
│ │ │ │ │ └── http4s
│ │ │ │ │ ├── Http4sBodyListener.scala
│ │ │ │ │ ├── Http4sRequestBody.scala
│ │ │ │ │ ├── Http4sServerInterpreter.scala
│ │ │ │ │ ├── Http4sServerOptions.scala
│ │ │ │ │ ├── Http4sServerRequest.scala
│ │ │ │ │ ├── Http4sServerSentEvents.scala
│ │ │ │ │ ├── Http4sToResponseBody.scala
│ │ │ │ │ ├── Http4sWebSockets.scala
│ │ │ │ │ └── package.scala
│ │ │ ├── scalajvm
│ │ │ │ └── sttp
│ │ │ │ │ └── tapir
│ │ │ │ │ └── server
│ │ │ │ │ └── http4s
│ │ │ │ │ └── Http4sDefaultServerLog.scala
│ │ │ └── scalanative
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── http4s
│ │ │ │ └── Http4sDefaultServerLog.scala
│ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── http4s
│ │ │ ├── Http4sServerSentEventsTest.scala
│ │ │ ├── Http4sServerStubTest.scala
│ │ │ ├── Http4sServerTest.scala
│ │ │ └── Http4sTestServerInterpreter.scala
│ └── zio
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── http4s
│ │ │ └── ztapir
│ │ │ ├── ConvertStreams.scala
│ │ │ ├── ZHttp4sServerInterpreter.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── http4s
│ │ └── ztapir
│ │ ├── ZEndpointTest.scala
│ │ ├── ZHttp4sServerStubTest.scala
│ │ ├── ZHttp4sServerTest.scala
│ │ └── ZHttp4sTestServerInterpreter.scala
├── jdkhttp-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── jdkhttp
│ │ │ ├── JdkHttpServer.scala
│ │ │ ├── JdkHttpServerInterpreter.scala
│ │ │ ├── JdkHttpServerOptions.scala
│ │ │ ├── internal
│ │ │ ├── JdkHttpBodyListener.scala
│ │ │ ├── JdkHttpRequestBody.scala
│ │ │ ├── JdkHttpServerRequest.scala
│ │ │ ├── JdkHttpToResponseBody.scala
│ │ │ ├── KMPMatcher.scala
│ │ │ ├── LimitedInputStream.scala
│ │ │ ├── ParsedMultiPart.scala
│ │ │ └── package.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── jdkhttp
│ │ ├── JdkHttpServerTest.scala
│ │ ├── JdkHttpTestServerInterpreter.scala
│ │ └── internal
│ │ └── KMPMatcherTest.scala
├── netty-server
│ ├── cats
│ │ └── src
│ │ │ ├── main
│ │ │ ├── scala-2.12
│ │ │ │ └── sttp
│ │ │ │ │ └── tapir
│ │ │ │ │ └── server
│ │ │ │ │ └── netty
│ │ │ │ │ └── cats
│ │ │ │ │ └── internal
│ │ │ │ │ └── ExecutionContexts.scala
│ │ │ ├── scala-3-2.13+
│ │ │ │ └── sttp
│ │ │ │ │ └── tapir
│ │ │ │ │ └── server
│ │ │ │ │ └── netty
│ │ │ │ │ └── cats
│ │ │ │ │ └── internal
│ │ │ │ │ └── ExecutionContexts.scala
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── netty
│ │ │ │ └── cats
│ │ │ │ ├── NettyCatsServer.scala
│ │ │ │ ├── NettyCatsServerInterpreter.scala
│ │ │ │ ├── NettyCatsServerOptions.scala
│ │ │ │ └── internal
│ │ │ │ ├── CatsUtil.scala
│ │ │ │ ├── Fs2StreamCompatible.scala
│ │ │ │ ├── NettyCatsRequestBody.scala
│ │ │ │ └── WebSocketPipeProcessor.scala
│ │ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── netty
│ │ │ └── cats
│ │ │ ├── NettyCatsServerStubTest.scala
│ │ │ ├── NettyCatsServerTest.scala
│ │ │ ├── NettyCatsTestServerInterpreter.scala
│ │ │ └── NettyFs2StreamingCancellationTest.scala
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── netty
│ │ │ │ ├── NettyConfig.scala
│ │ │ │ ├── NettyFutureServer.scala
│ │ │ │ ├── NettyFutureServerInterpreter.scala
│ │ │ │ ├── NettyFutureServerOptions.scala
│ │ │ │ ├── NettyResponseContent.scala
│ │ │ │ ├── NettyServerRequest.scala
│ │ │ │ ├── NettySocketConfig.scala
│ │ │ │ ├── internal
│ │ │ │ ├── FutureUtil.scala
│ │ │ │ ├── NettyBodyListener.scala
│ │ │ │ ├── NettyBootstrap.scala
│ │ │ │ ├── NettyConnectionCounter.scala
│ │ │ │ ├── NettyDefaults.scala
│ │ │ │ ├── NettyFutureRequestBody.scala
│ │ │ │ ├── NettyRequestBody.scala
│ │ │ │ ├── NettyServerHandler.scala
│ │ │ │ ├── NettyServerInterpreter.scala
│ │ │ │ ├── NettyStreamingRequestBody.scala
│ │ │ │ ├── NettyToResponseBody.scala
│ │ │ │ ├── NettyToStreamsResponseBody.scala
│ │ │ │ ├── RunAsync.scala
│ │ │ │ ├── StreamCompatible.scala
│ │ │ │ ├── UnhandledExceptionHandler.scala
│ │ │ │ ├── package.scala
│ │ │ │ ├── reactivestreams
│ │ │ │ │ ├── CancellingSubscriber.scala
│ │ │ │ │ ├── FileRangePublisher.scala
│ │ │ │ │ ├── FileWriterSubscriber.scala
│ │ │ │ │ ├── InputStreamPublisher.scala
│ │ │ │ │ ├── LimitedLengthSubscriber.scala
│ │ │ │ │ ├── PromisingSubscriber.scala
│ │ │ │ │ ├── SimpleSubscriber.scala
│ │ │ │ │ ├── SubscribeTrackingStreamedHttpRequest.scala
│ │ │ │ │ └── SubscriberInputStream.scala
│ │ │ │ └── ws
│ │ │ │ │ ├── WebSocketAutoPingHandler.scala
│ │ │ │ │ ├── WebSocketFrameConverters.scala
│ │ │ │ │ └── WebSocketPingPongFrameHandler.scala
│ │ │ │ └── package.scala
│ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── netty
│ │ │ ├── NettyFutureRequestTimeoutTests.scala
│ │ │ ├── NettyFutureServerStubTest.scala
│ │ │ ├── NettyFutureServerTest.scala
│ │ │ ├── NettyFutureTestServerInterpreter.scala
│ │ │ ├── NettyServerRequestSpec.scala
│ │ │ └── internal
│ │ │ └── reactivestreams
│ │ │ └── SubscriberInputStreamTest.scala
│ ├── sync
│ │ └── src
│ │ │ ├── main
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── netty
│ │ │ │ └── sync
│ │ │ │ ├── NettySyncServer.scala
│ │ │ │ ├── NettySyncServerInterpreter.scala
│ │ │ │ ├── NettySyncServerOptions.scala
│ │ │ │ ├── OxServerSentEvents.scala
│ │ │ │ ├── OxStreams.scala
│ │ │ │ ├── internal
│ │ │ │ ├── NettySyncRequestBody.scala
│ │ │ │ ├── NettySyncToResponseBody.scala
│ │ │ │ ├── reactivestreams
│ │ │ │ │ ├── ChannelSubscription.scala
│ │ │ │ │ └── OxProcessor.scala
│ │ │ │ └── ws
│ │ │ │ │ └── OxSourceWebSocketProcessor.scala
│ │ │ │ └── sync.scala
│ │ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── netty
│ │ │ └── sync
│ │ │ ├── NettySyncRequestTimeoutTests.scala
│ │ │ ├── NettySyncServerTest.scala
│ │ │ ├── NettySyncTestServerInterpreter.scala
│ │ │ └── perf
│ │ │ └── NettySyncServerRunner.scala
│ └── zio
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── netty
│ │ │ └── zio
│ │ │ ├── NettyZioServer.scala
│ │ │ ├── NettyZioServerInterpreter.scala
│ │ │ ├── NettyZioServerOptions.scala
│ │ │ └── internal
│ │ │ ├── NettyZioRequestBody.scala
│ │ │ ├── ZioStreamCompatible.scala
│ │ │ └── ZioUtil.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── netty
│ │ └── zio
│ │ ├── NettyZioServerStubTest.scala
│ │ ├── NettyZioServerTest.scala
│ │ └── NettyZioTestServerInterpreter.scala
├── nima-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── nima
│ │ │ ├── NimaServerInterpreter.scala
│ │ │ ├── NimaServerOptions.scala
│ │ │ └── internal
│ │ │ ├── NimaBodyListener.scala
│ │ │ ├── NimaRequestBody.scala
│ │ │ ├── NimaServerRequest.scala
│ │ │ ├── NimaToResponseBody.scala
│ │ │ └── package.scala
│ │ └── test
│ │ ├── resources
│ │ └── logback.xml
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── nima
│ │ ├── NimaServerTest.scala
│ │ └── NimaTestServerInterpreter.scala
├── pekko-grpc-server
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── pekkogrpc
│ │ ├── PekkoGrpcRequestBody.scala
│ │ ├── PekkoGrpcServerInterpreter.scala
│ │ └── PekkoGrpcToResponseBody.scala
├── pekko-http-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── pekkohttp
│ │ │ ├── ContentTypeCache.scala
│ │ │ ├── PekkoBodyListener.scala
│ │ │ ├── PekkoHttpServerInterpreter.scala
│ │ │ ├── PekkoHttpServerOptions.scala
│ │ │ ├── PekkoModel.scala
│ │ │ ├── PekkoRequestBody.scala
│ │ │ ├── PekkoServerRequest.scala
│ │ │ ├── PekkoServerSentEvents.scala
│ │ │ ├── PekkoStreamSizeExceptionInterceptor.scala
│ │ │ ├── PekkoToResponseBody.scala
│ │ │ ├── PekkoWebSockets.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── pekkohttp
│ │ ├── PekkoHttpServerStubTest.scala
│ │ ├── PekkoHttpServerTest.scala
│ │ ├── PekkoHttpTestServerInterpreter.scala
│ │ └── PekkoServerSentEventsTest.scala
├── play-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── play
│ │ │ ├── PlayBodyListener.scala
│ │ │ ├── PlayRequestBody.scala
│ │ │ ├── PlayServerInterpreter.scala
│ │ │ ├── PlayServerOptions.scala
│ │ │ ├── PlayServerRequest.scala
│ │ │ ├── PlayToResponseBody.scala
│ │ │ ├── PlayWebSockets.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── play
│ │ ├── PlayServerStubTest.scala
│ │ ├── PlayServerTest.scala
│ │ ├── PlayServerWithContextTest.scala
│ │ └── PlayTestServerInterpreter.scala
├── play29-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── play
│ │ │ ├── PlayBodyListener.scala
│ │ │ ├── PlayRequestBody.scala
│ │ │ ├── PlayServerInterpreter.scala
│ │ │ ├── PlayServerOptions.scala
│ │ │ ├── PlayServerRequest.scala
│ │ │ ├── PlayToResponseBody.scala
│ │ │ ├── PlayWebSockets.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── play
│ │ ├── PlayServerStubTest.scala
│ │ ├── PlayServerTest.scala
│ │ ├── PlayServerWithContextTest.scala
│ │ └── PlayTestServerInterpreter.scala
├── sttp-mock-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── mockserver
│ │ │ ├── MockServerException.scala
│ │ │ ├── SttpMockServerClient.scala
│ │ │ ├── impl
│ │ │ └── JsonCodecs.scala
│ │ │ └── model.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── mockserver
│ │ ├── SttpMockServerClientSpec.scala
│ │ └── fixture
│ │ └── fixture.scala
├── sttp-stub-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── stub
│ │ │ ├── SttpRequest.scala
│ │ │ ├── SttpRequestBody.scala
│ │ │ ├── SttpRequestDecoder.scala
│ │ │ ├── SttpResponseEncoder.scala
│ │ │ ├── SttpStubServer.scala
│ │ │ ├── StubServerInterpreter.scala
│ │ │ ├── TapirStubInterpreter.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── stub
│ │ ├── SttpClientTestUsingStub.scala
│ │ ├── SttpStubServerTest.scala
│ │ └── TapirStubInterpreterTest.scala
├── sttp-stub4-server
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── stub4
│ │ │ ├── SttpRequest.scala
│ │ │ ├── SttpRequestBody.scala
│ │ │ ├── SttpRequestDecoder.scala
│ │ │ ├── SttpResponseEncoder.scala
│ │ │ ├── SttpStubServer.scala
│ │ │ ├── StubServerInterpreter.scala
│ │ │ ├── TapirStubInterpreter.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── stub4
│ │ ├── SttpClientTestUsingStub.scala
│ │ ├── SttpStubServerTest.scala
│ │ └── TapirStubInterpreterTest.scala
├── tests
│ └── src
│ │ └── main
│ │ ├── resources
│ │ ├── test
│ │ │ ├── d1
│ │ │ │ ├── d2
│ │ │ │ │ └── r4.txt
│ │ │ │ ├── index.html
│ │ │ │ └── r3.txt
│ │ │ ├── r1.txt
│ │ │ ├── r2.txt
│ │ │ ├── r3.txt
│ │ │ └── r3.txt.gz
│ │ └── test2
│ │ │ └── r5.txt
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── tests
│ │ ├── AllServerTests.scala
│ │ ├── CreateServerStubTest.scala
│ │ ├── CreateServerTest.scala
│ │ ├── ServerBasicTests.scala
│ │ ├── ServerCORSTests.scala
│ │ ├── ServerCancellationTests.scala
│ │ ├── ServerContentNegotiationTests.scala
│ │ ├── ServerFileTests.scala
│ │ ├── ServerFilesTests.scala
│ │ ├── ServerGracefulShutdownTests.scala
│ │ ├── ServerMappingTests.scala
│ │ ├── ServerMetricsTest.scala
│ │ ├── ServerMultipartTests.scala
│ │ ├── ServerOneOfBodyTests.scala
│ │ ├── ServerOneOfTests.scala
│ │ ├── ServerOptionsTests.scala
│ │ ├── ServerRejectTests.scala
│ │ ├── ServerSecurityTests.scala
│ │ ├── ServerStreamingTests.scala
│ │ ├── ServerStubStreamingTest.scala
│ │ ├── ServerStubTest.scala
│ │ ├── ServerValidationTests.scala
│ │ ├── ServerWebSocketTests.scala
│ │ ├── Sleeper.scala
│ │ ├── TestServerInterpreter.scala
│ │ └── package.scala
├── vertx-server
│ ├── cats
│ │ └── src
│ │ │ ├── main
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── vertx
│ │ │ │ └── cats
│ │ │ │ ├── VertxCatsServerInterpreter.scala
│ │ │ │ ├── VertxCatsServerOptions.scala
│ │ │ │ └── streams
│ │ │ │ └── fs2.scala
│ │ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── vertx
│ │ │ └── cats
│ │ │ ├── CatsVertxServerTest.scala
│ │ │ ├── CatsVertxTestServerInterpreter.scala
│ │ │ ├── VertxStubServerTest.scala
│ │ │ └── streams
│ │ │ └── Fs2StreamTest.scala
│ ├── src
│ │ ├── main
│ │ │ └── scala
│ │ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── server
│ │ │ │ └── vertx
│ │ │ │ ├── RichResponse.scala
│ │ │ │ ├── VertxBodyListener.scala
│ │ │ │ ├── VertxErrorHandler.scala
│ │ │ │ ├── VertxFutureServerInterpreter.scala
│ │ │ │ ├── VertxFutureServerOptions.scala
│ │ │ │ ├── VertxServerOptions.scala
│ │ │ │ ├── decoders
│ │ │ │ ├── VertxRequestBody.scala
│ │ │ │ └── VertxServerRequest.scala
│ │ │ │ ├── encoders
│ │ │ │ ├── VertxOutputEncoders.scala
│ │ │ │ ├── VertxToResponseBody.scala
│ │ │ │ └── package.scala
│ │ │ │ ├── handlers
│ │ │ │ └── package.scala
│ │ │ │ ├── interpreters
│ │ │ │ ├── CommonServerInterpreter.scala
│ │ │ │ ├── FromVFuture.scala
│ │ │ │ └── RunAsync.scala
│ │ │ │ ├── routing
│ │ │ │ ├── MethodMapping.scala
│ │ │ │ └── PathMapping.scala
│ │ │ │ └── streams
│ │ │ │ ├── LimitedReadStream.scala
│ │ │ │ ├── Pipe.scala
│ │ │ │ ├── ReadStreamCompatible.scala
│ │ │ │ ├── domain.scala
│ │ │ │ ├── package.scala
│ │ │ │ └── websocket.scala
│ │ └── test
│ │ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── vertx
│ │ │ ├── VertxBlockingServerTest.scala
│ │ │ ├── VertxServerTest.scala
│ │ │ ├── VertxStubServerTest.scala
│ │ │ ├── VertxTestServerBlockingInterpreter.scala
│ │ │ ├── VertxTestServerInterpreter.scala
│ │ │ └── streams
│ │ │ └── FakeStream.scala
│ └── zio
│ │ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── server
│ │ │ └── vertx
│ │ │ └── zio
│ │ │ ├── VertxZioServerInterpreter.scala
│ │ │ ├── VertxZioServerOptions.scala
│ │ │ └── streams
│ │ │ └── zio.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── vertx
│ │ └── zio
│ │ ├── VertxStubServerTest.scala
│ │ ├── ZioVertxServerTest.scala
│ │ ├── ZioVertxTestServerInterpreter.scala
│ │ └── streams
│ │ └── ZStreamTest.scala
└── zio-http-server
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── ziohttp
│ │ ├── ZioHttpBodyListener.scala
│ │ ├── ZioHttpInterpreter.scala
│ │ ├── ZioHttpRequestBody.scala
│ │ ├── ZioHttpResponseBody.scala
│ │ ├── ZioHttpServerOptions.scala
│ │ ├── ZioHttpServerRequest.scala
│ │ ├── ZioHttpToResponseBody.scala
│ │ ├── ZioWebSockets.scala
│ │ └── package.scala
│ └── test
│ └── scala
│ ├── sttp
│ └── tapir
│ │ └── server
│ │ └── ziohttp
│ │ ├── ZioHttpCompositionTest.scala
│ │ ├── ZioHttpServerStubTest.scala
│ │ ├── ZioHttpServerTest.scala
│ │ └── ZioHttpTestServerInterpreter.scala
│ └── zio
│ ├── http
│ └── netty
│ │ └── TestChannelFactories.scala
│ └── test
│ └── package.scala
├── serverless
└── aws
│ ├── cdk-tests
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── cdk
│ │ │ └── tests
│ │ │ ├── AwsCdkAppTemplate.scala
│ │ │ ├── CdkTestLambdaHandler.scala
│ │ │ └── tests.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── cdk
│ │ └── tests
│ │ └── AwsCdkAppLocalHttpTest.scala
│ ├── cdk
│ └── src
│ │ ├── main
│ │ ├── resources
│ │ │ └── app-template
│ │ │ │ ├── bin
│ │ │ │ └── tapir-cdk-stack.ts
│ │ │ │ ├── cdk.json
│ │ │ │ ├── gitignore
│ │ │ │ ├── jest.config.js
│ │ │ │ ├── lib
│ │ │ │ └── stack-template.ts
│ │ │ │ ├── package.json
│ │ │ │ ├── readme.md
│ │ │ │ └── tsconfig.json
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── cdk
│ │ │ ├── AwsCdkInterpreter.scala
│ │ │ ├── AwsCdkOptions.scala
│ │ │ ├── CdkAppTemplate.scala
│ │ │ └── internal
│ │ │ ├── AppTemplateFiles.scala
│ │ │ ├── Method.scala
│ │ │ ├── ParseStackTemplate.scala
│ │ │ ├── Request.scala
│ │ │ ├── Segment.scala
│ │ │ ├── StackFile.scala
│ │ │ ├── Tree.scala
│ │ │ ├── TreeToTypeScript.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── cdk
│ │ ├── IOLambdaHandlerV1Test.scala
│ │ ├── internal
│ │ ├── ParseStackTemplateTest.scala
│ │ ├── RequestTest.scala
│ │ ├── SegmentTest.scala
│ │ ├── TreeTest.scala
│ │ └── TreeToTypeScriptTest.scala
│ │ └── test
│ │ ├── IOLambdaHandlerV1.scala
│ │ └── TestEndpoints.scala
│ ├── examples
│ └── src
│ │ └── main
│ │ ├── scalajs
│ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── examples
│ │ │ ├── LambdaApiJsExample.scala
│ │ │ └── LambdaApiJsResourceExample.scala
│ │ └── scalajvm
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── examples
│ │ ├── CdkAppExample.scala
│ │ ├── LambdaApiExample.scala
│ │ ├── LambdaApiV1Example.scala
│ │ ├── SamJsTemplateExample.scala
│ │ ├── SamTemplateExample.scala
│ │ └── TerraformConfigExample.scala
│ ├── lambda-cats-effect-tests
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── lambda
│ │ │ └── tests
│ │ │ ├── IOLambdaHandlerV2.scala
│ │ │ ├── LambdaSamTemplate.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── lambda
│ │ └── tests
│ │ ├── AwsLambdaCreateServerStubTest.scala
│ │ ├── AwsLambdaSamLocalHttpTest.scala
│ │ └── AwsLambdaStubHttpTest.scala
│ ├── lambda-cats-effect
│ └── src
│ │ ├── main
│ │ ├── scala
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── serverless
│ │ │ │ └── aws
│ │ │ │ └── lambda
│ │ │ │ ├── AwsCatsEffectServerInterpreter.scala
│ │ │ │ ├── AwsCatsEffectServerOptions.scala
│ │ │ │ ├── LambdaHandler.scala
│ │ │ │ └── runtime
│ │ │ │ └── AwsLambdaRuntimeInvocation.scala
│ │ ├── scalajs
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── serverless
│ │ │ │ └── aws
│ │ │ │ └── lambda
│ │ │ │ └── js
│ │ │ │ └── AwsJsRouteHandler.scala
│ │ └── scalajvm
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── lambda
│ │ │ └── runtime
│ │ │ └── AwsLambdaRuntime.scala
│ │ └── test
│ │ └── scalajvm
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── lambda
│ │ └── runtime
│ │ └── AwsLambdaRuntimeInvocationTest.scala
│ ├── lambda-core
│ └── src
│ │ ├── main
│ │ ├── scala
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── serverless
│ │ │ │ └── aws
│ │ │ │ └── lambda
│ │ │ │ ├── AwsBodyListener.scala
│ │ │ │ ├── AwsFutureServerInterpreter.scala
│ │ │ │ ├── AwsFutureServerOptions.scala
│ │ │ │ ├── AwsRequestBody.scala
│ │ │ │ ├── AwsServerInterpreter.scala
│ │ │ │ ├── AwsServerOptions.scala
│ │ │ │ ├── AwsServerRequest.scala
│ │ │ │ ├── model.scala
│ │ │ │ └── package.scala
│ │ ├── scalajs
│ │ │ └── sttp
│ │ │ │ └── tapir
│ │ │ │ └── serverless
│ │ │ │ └── aws
│ │ │ │ └── lambda
│ │ │ │ ├── AwsToResponseBody.scala
│ │ │ │ └── js
│ │ │ │ ├── AwsJsRequest.scala
│ │ │ │ ├── AwsJsResponse.scala
│ │ │ │ └── package.scala
│ │ └── scalajvm
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── lambda
│ │ │ └── AwsToResponseBody.scala
│ │ └── test
│ │ └── scalajvm
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── lambda
│ │ └── MapperTest.scala
│ ├── lambda-zio-tests
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── ziolambda
│ │ │ └── tests
│ │ │ ├── LambdaSamTemplate.scala
│ │ │ ├── ZioLambdaHandlerImpl.scala
│ │ │ └── package.scala
│ │ └── test
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── ziolambda
│ │ └── tests
│ │ ├── AwsLambdaCreateServerStubTest.scala
│ │ ├── AwsLambdaSamLocalHttpTest.scala
│ │ └── AwsLambdaStubHttpTest.scala
│ ├── lambda-zio
│ └── src
│ │ └── main
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── ziolambda
│ │ ├── AwsZioServerInterpreter.scala
│ │ ├── AwsZioServerOptions.scala
│ │ └── ZioLambdaHandler.scala
│ ├── sam
│ └── src
│ │ ├── main
│ │ └── scala
│ │ │ └── sttp
│ │ │ └── tapir
│ │ │ └── serverless
│ │ │ └── aws
│ │ │ └── sam
│ │ │ ├── AwsSamInterpreter.scala
│ │ │ ├── AwsSamOptions.scala
│ │ │ ├── AwsSamTemplateEncoders.scala
│ │ │ ├── EndpointsToSamTemplate.scala
│ │ │ ├── Printer.scala
│ │ │ ├── model.scala
│ │ │ └── parameter
│ │ │ ├── AwsSamOptionsParameterized.scala
│ │ │ └── InputParameter.scala
│ │ └── test
│ │ ├── resources
│ │ ├── code_source_template.yaml
│ │ ├── code_source_template_with_params_and_role.yaml
│ │ ├── http_api_template.yaml
│ │ └── image_source_template.yaml
│ │ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── sam
│ │ ├── VerifySamTemplateTest.scala
│ │ └── parameter
│ │ ├── AwsSamOptionsParameterizedTest.scala
│ │ └── InputParametersTest.scala
│ └── terraform
│ └── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── serverless
│ │ └── aws
│ │ └── terraform
│ │ ├── AwsTerraformEncoders.scala
│ │ ├── AwsTerraformInterpreter.scala
│ │ ├── AwsTerraformOptions.scala
│ │ ├── EndpointsToTerraformConfig.scala
│ │ ├── TerraformResource.scala
│ │ └── model.scala
│ └── test
│ ├── resources
│ ├── endpoint_with_params.json
│ ├── endpoints_common_paths.json
│ ├── root_endpoint.json
│ └── simple_endpoint.json
│ └── scala
│ └── sttp
│ └── tapir
│ └── serverless
│ └── aws
│ └── terraform
│ └── VerifyTerraformTemplateTest.scala
├── testing
└── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── testing
│ │ ├── EndpointVerificationError.scala
│ │ └── EndpointVerifier.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── testing
│ └── EndpointVerifierTest.scala
├── tests
└── src
│ └── main
│ ├── resources
│ └── logback.xml
│ ├── scala
│ └── sttp
│ │ └── tapir
│ │ └── tests
│ │ ├── Basic.scala
│ │ ├── ContentNegotiation.scala
│ │ ├── Files.scala
│ │ ├── Mapping.scala
│ │ ├── Multipart.scala
│ │ ├── OneOf.scala
│ │ ├── OneOfBody.scala
│ │ ├── Security.scala
│ │ ├── Streaming.scala
│ │ ├── Test.scala
│ │ ├── TestUtil.scala
│ │ ├── Validation.scala
│ │ ├── data
│ │ ├── BasketOfFruits.scala
│ │ ├── Color.scala
│ │ ├── CustomError.scala
│ │ ├── Entity.scala
│ │ ├── Fruit.scala
│ │ ├── FruitAmount.scala
│ │ ├── FruitAmountWrapper.scala
│ │ ├── FruitData.scala
│ │ ├── FruitError.scala
│ │ └── FruitErrorDetail.scala
│ │ └── package.scala
│ ├── scalajs
│ └── sttp
│ │ └── tapir
│ │ └── tests
│ │ └── TestUtilExtensions.scala
│ ├── scalajvm
│ └── sttp
│ │ └── tapir
│ │ └── tests
│ │ ├── TestSuite.scala
│ │ └── TestUtilExtensions.scala
│ └── scalanative
│ └── sttp
│ └── tapir
│ └── tests
│ └── TestUtilExtensions.scala
└── tracing
├── opentelemetry-tracing
└── src
│ ├── main
│ └── scala
│ │ └── sttp
│ │ └── tapir
│ │ └── server
│ │ └── tracing
│ │ └── opentelemetry
│ │ ├── OpenTelemetryTracing.scala
│ │ └── OpenTelemetryTracingConfig.scala
│ └── test
│ └── scala
│ └── sttp
│ └── tapir
│ └── server
│ └── tracing
│ └── opentelemetry
│ └── OpenTelemetryTracingTest.scala
└── otel4s-tracing
└── src
├── main
└── scala
│ └── sttp
│ └── tapir
│ └── server
│ └── tracing
│ └── otel4s
│ ├── Otel4sTracing.scala
│ └── Otel4sTracingConfig.scala
└── test
└── scala
└── sttp
└── tapir
└── server
└── tracing
└── otel4s
└── Otel4sTracingTest.scala
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a bug report
4 | title: "[BUG]"
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | Tapir version: ***
11 |
12 | Scala version: ***
13 |
14 | **Describe the bug**
15 |
16 | What is the problem?
17 |
18 | **How to reproduce?**
19 |
20 | Maybe you can provide code to reproduce the problem?
21 |
22 | **Additional information**
23 |
--------------------------------------------------------------------------------
/.github/dependabot.yaml:
--------------------------------------------------------------------------------
1 | # Set update schedule for GitHub Actions
2 |
3 | version: 2
4 | updates:
5 |
6 | - package-ecosystem: "github-actions"
7 | directory: "/"
8 | schedule:
9 | # Check for updates to GitHub Actions every week
10 | interval: "weekly"
11 | # Raise all pull requests with labels
12 | labels:
13 | - "dependency"
14 | - "automerge"
--------------------------------------------------------------------------------
/.github/labeler.yml:
--------------------------------------------------------------------------------
1 | version: 1
2 | labels:
3 | - label: "automerge"
4 | authors: ["softwaremill-ci"]
5 | files:
6 | - "build.sbt"
7 | - "project/Versions.scala"
8 | - "project/plugins.sbt"
9 | - "examples\\/src\\/main\\/scala\\/.*"
10 | - label: "dependency"
11 | authors: ["softwaremill-ci"]
12 | files:
13 | - "build.sbt"
14 | - "project/Versions.scala"
15 | - "project/plugins.sbt"
16 | - "examples\\/src\\/main\\/scala\\/.*"
17 |
--------------------------------------------------------------------------------
/.github/release-drafter.yml:
--------------------------------------------------------------------------------
1 | categories:
2 | - title: 'Dependency updates'
3 | labels:
4 | - 'dependency'
5 | template: |
6 | ## What’s Changed
7 |
8 | $CHANGES
--------------------------------------------------------------------------------
/.github/workflows/dependency-graph.yml:
--------------------------------------------------------------------------------
1 | # https://scala-lang.org/blog/2022/07/18/secure-your-dependencies-on-github.html
2 | name: Update Dependency Graph
3 |
4 | on:
5 | push:
6 | branches:
7 | - master
8 |
9 | jobs:
10 | update-graph:
11 | name: Update Dependency Graph
12 | runs-on: ubuntu-24.04
13 | steps:
14 | - uses: actions/checkout@v4
15 | - uses: sbt/setup-sbt@v1
16 | - uses: scalacenter/sbt-dependency-submission@v3
17 |
--------------------------------------------------------------------------------
/.github/workflows/rebase-cmd-dispatch.yml:
--------------------------------------------------------------------------------
1 | # On any comment, it will look for '/rebase' in the comment body and in case of hit, it dispatches rebase cmd
2 | # with event type 'rebase-command' which triggers 'rebase-command` WF that performs the rebase operation.
3 | name: Slash Command Dispatch
4 | on:
5 | issue_comment:
6 | types: [created]
7 | jobs:
8 | rebase-cmd-dispatch:
9 | uses: softwaremill/github-actions-workflows/.github/workflows/rebase-cmd-dispatch.yml@main
10 | secrets:
11 | repo-github-token: ${{ secrets.REPO_GITHUB_TOKEN }}
--------------------------------------------------------------------------------
/.github/workflows/rebase-cmd.yml:
--------------------------------------------------------------------------------
1 | name: rebase-command
2 | on:
3 | repository_dispatch:
4 | types: [rebase-command]
5 | jobs:
6 | rebase:
7 | uses: softwaremill/github-actions-workflows/.github/workflows/rebase-cmd.yml@main
8 | secrets:
9 | repo-github-token: ${{ secrets.REPO_GITHUB_TOKEN }}
--------------------------------------------------------------------------------
/.github/workflows/scala-steward.yml:
--------------------------------------------------------------------------------
1 | name: Scala Steward
2 |
3 | # This workflow will launch at 00:00 every day
4 | on:
5 | schedule:
6 | - cron: '0 0 * * *'
7 | workflow_dispatch:
8 |
9 | jobs:
10 | scala-steward:
11 | uses: softwaremill/github-actions-workflows/.github/workflows/scala-steward.yml@main
12 | secrets:
13 | repo-github-token: ${{secrets.REPO_GITHUB_TOKEN}}
14 |
--------------------------------------------------------------------------------
/.github/workflows/test-report.yml:
--------------------------------------------------------------------------------
1 | name: 'Test Report'
2 | on:
3 | workflow_run:
4 | workflows: ['CI']
5 | types:
6 | - completed
7 |
8 | permissions:
9 | contents: read
10 | actions: read
11 | checks: write
12 |
13 | jobs:
14 | test-report:
15 | uses: softwaremill/github-actions-workflows/.github/workflows/test-report.yml@main
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.class
2 | *.log
3 |
4 | .cache
5 | .history
6 | .env/
7 | .lib/
8 | /cdk
9 | /aws-cdk-tests
10 | .vscode/
11 | dist/*
12 | target/
13 | lib_managed/
14 | src_managed/
15 | project/boot/
16 | project/plugins/project/
17 | .bloop
18 | .metals
19 | metals.sbt
20 | .sbt
21 | template.yaml
22 | aws-lambda-cats-effect-template.yaml
23 | aws-lambda-zio-template.yaml
24 | .scala-build
25 |
26 | .bsp
27 | .idea*
28 | .java-version
29 |
30 | file-uploads
31 |
--------------------------------------------------------------------------------
/.readthedocs.yaml:
--------------------------------------------------------------------------------
1 | version: 2
2 |
3 | sphinx:
4 | configuration: generated-doc/out/conf.py
5 |
6 | python:
7 | install:
8 | - requirements: generated-doc/out/requirements.txt
9 |
10 | build:
11 | os: ubuntu-22.04
12 | tools:
13 | python: "3.12"
14 |
--------------------------------------------------------------------------------
/.sbtopts:
--------------------------------------------------------------------------------
1 | -J-Xmx8G
2 | -J-Xss2M
3 | -Dsbt.task.timings=false
4 |
--------------------------------------------------------------------------------
/.scala-steward.conf:
--------------------------------------------------------------------------------
1 | updates.ignore = [
2 | {groupId = "org.scala-lang", artifactId = "scala-compiler", version = "2.12."},
3 | {groupId = "org.scala-lang", artifactId = "scala-compiler", version = "2.13."},
4 | {groupId = "org.scala-lang", artifactId = "scala-compiler", version = "3."},
5 | {groupId = "io.circe", artifactId="circe-yaml", version="1.15.0" }
6 | ]
7 | updates.pin = [
8 | {groupId = "com.typesafe.akka", version = "2.6."},
9 | # Gatling uses scopt 3.7.1 and fails on Gatling/testOnly for scopt 4.x
10 | {groupId = "com.github.scopt", artifactId = "scopt", version = "3.7.1"},
11 | {groupId = "org.scala-lang", artifactId = "scala3-library", version = "3.3."},
12 | {groupId = "org.scala-lang", artifactId = "scala3-library_sjs1", version = "3.3."}
13 | ]
14 |
--------------------------------------------------------------------------------
/.scalafix.conf:
--------------------------------------------------------------------------------
1 | OrganizeImports.groupedImports = AggressiveMerge
2 | OrganizeImports.targetDialect = Scala3
3 | OrganizeImports.removeUnused = false
--------------------------------------------------------------------------------
/.scalafmt.conf:
--------------------------------------------------------------------------------
1 | version = 3.9.4
2 | maxColumn = 140
3 | runner.dialect = scala213
4 | fileOverride {
5 | "glob:**/scala-3/**" {
6 | runner.dialect = scala3
7 | }
8 | "glob:**/examples/**" {
9 | runner.dialect = scala3
10 | }
11 | "glob:**/integrations/iron/**" {
12 | runner.dialect = scala3
13 | }
14 | "glob:**/json/pickler/**" {
15 | runner.dialect = scala3
16 | }
17 | "glob:**/server/netty-server/sync/**" {
18 | runner.dialect = scala3
19 | }
20 | }
--------------------------------------------------------------------------------
/banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/banner.png
--------------------------------------------------------------------------------
/client/http4s-client/src/main/scala/sttp/tapir/client/http4s/Http4sClientOptions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.http4s
2 |
3 | import sttp.tapir.{Defaults, TapirFile}
4 |
5 | case class Http4sClientOptions(createFile: () => TapirFile)
6 |
7 | object Http4sClientOptions {
8 | val default: Http4sClientOptions = Http4sClientOptions(Defaults.createTempFile)
9 | }
10 |
--------------------------------------------------------------------------------
/client/http4s-client/src/test/scala/sttp/tapir/client/http4s/Http4ClientStreamingTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.http4s
2 |
3 | import cats.effect.IO
4 |
5 | import fs2.text
6 | import sttp.capabilities.fs2.Fs2Streams
7 | import sttp.tapir.client.tests.ClientStreamingTests
8 |
9 | class Http4ClientStreamingTests extends Http4sClientTests[Fs2Streams[IO]] with ClientStreamingTests[Fs2Streams[IO]] {
10 | override val streams: Fs2Streams[IO] = Fs2Streams[IO]
11 | override def mkStream(s: String): streams.BinaryStream = fs2.Stream(s).through(text.utf8.encode)
12 | override def rmStream(s: streams.BinaryStream): String = s.through(text.utf8.decode).compile.string.unsafeRunSync()
13 |
14 | streamingTests()
15 | }
16 |
--------------------------------------------------------------------------------
/client/http4s-client/src/test/scala/sttp/tapir/client/http4s/Http4sClientBasicTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.http4s
2 |
3 | import sttp.tapir.client.tests.ClientBasicTests
4 |
5 | class Http4sClientBasicTests extends Http4sClientTests[Any] with ClientBasicTests {
6 | tests()
7 | }
8 |
--------------------------------------------------------------------------------
/client/http4s-client/src/test/scala/sttp/tapir/client/http4s/Http4sClientRequestTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.http4s
2 |
3 | import cats.effect._
4 | import org.scalatest.funsuite.AnyFunSuite
5 | import org.scalatest.matchers.should.Matchers
6 | import sttp.tapir._
7 |
8 | class Http4sClientRequestTests extends AnyFunSuite with Matchers {
9 | test("should exclude optional query parameter when its value is None") {
10 | // given
11 | val testEndpoint = endpoint.get.in(query[Option[String]]("param"))
12 |
13 | // when
14 | val (http4sRequest, _) = Http4sClientInterpreter[IO]()
15 | .toRequest(testEndpoint, baseUri = None)
16 | .apply(None)
17 |
18 | // then
19 | http4sRequest.queryString shouldBe empty
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/client/play-client/src/main/scala/sttp/tapir/client/play/PlayClientOptions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.play
2 |
3 | import sttp.tapir.{Defaults, TapirFile}
4 |
5 | case class PlayClientOptions(createFile: () => TapirFile)
6 |
7 | object PlayClientOptions {
8 | val default: PlayClientOptions = PlayClientOptions(Defaults.createTempFile)
9 | }
10 |
--------------------------------------------------------------------------------
/client/play-client/src/test/scala/sttp/tapir/client/play/PlayClientBasicTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.play
2 |
3 | import sttp.tapir.client.tests.ClientBasicTests
4 |
5 | class PlayClientBasicTests extends PlayClientTests[Any] with ClientBasicTests {
6 |
7 | tests()
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/client/play29-client/src/main/scala/sttp/tapir/client/play/PlayClientOptions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.play
2 |
3 | import sttp.tapir.{Defaults, TapirFile}
4 |
5 | case class PlayClientOptions(createFile: () => TapirFile)
6 |
7 | object PlayClientOptions {
8 | val default: PlayClientOptions = PlayClientOptions(Defaults.createTempFile)
9 | }
10 |
--------------------------------------------------------------------------------
/client/play29-client/src/test/scala/sttp/tapir/client/play/PlayClientBasicTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.play
2 |
3 | import sttp.tapir.client.tests.ClientBasicTests
4 |
5 | class PlayClientBasicTests extends PlayClientTests[Any] with ClientBasicTests {
6 |
7 | tests()
8 |
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scala/sttp/tapir/client/sttp/SttpClientOptions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp
2 |
3 | import sttp.tapir.{Defaults, TapirFile}
4 |
5 | case class SttpClientOptions(createFile: () => TapirFile)
6 |
7 | object SttpClientOptions {
8 | val default: SttpClientOptions = SttpClientOptions(Defaults.createTempFile)
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajs/sttp/tapir/client/sttp/EndpointToSttpClientExtensions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp
2 |
3 | import sttp.model.StatusCode
4 |
5 | private[sttp] trait EndpointToSttpClientExtensions { this: EndpointToSttpClient[_] =>
6 |
7 | /** This needs to be platform-specific due to #2663, as on JS we don't get access to the 101 status code. */
8 | val webSocketSuccessStatusCode: StatusCode = StatusCode.Ok
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajs/sttp/tapir/client/sttp/ws/fs2/TapirSttpClientFs2WebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws.fs2
2 |
3 | import cats.effect.Concurrent
4 | import sttp.capabilities.WebSockets
5 | import sttp.capabilities.fs2.Fs2Streams
6 | import sttp.tapir.client.sttp.WebSocketToPipe
7 |
8 | trait TapirSttpClientFs2WebSockets {
9 | implicit def webSocketsSupportedForFs2Streams[F[_]: Concurrent]: WebSocketToPipe[Fs2Streams[F] with WebSockets] =
10 | new WebSocketToFs2Pipe[F, Fs2Streams[F] with WebSockets]
11 | }
12 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajs/sttp/tapir/client/sttp/ws/fs2/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws
2 |
3 | package object fs2 extends TapirSttpClientFs2WebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajs/sttp/tapir/client/sttp/ws/zio/TapirSttpClientZioWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws.zio
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.zio.ZioStreams
5 | import sttp.tapir.client.sttp.WebSocketToPipe
6 |
7 | trait TapirSttpClientZioWebSockets {
8 | implicit val webSocketsSupportedForZioStreams: WebSocketToPipe[ZioStreams with WebSockets] =
9 | new WebSocketToZioPipe[ZioStreams with WebSockets]
10 | }
11 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajs/sttp/tapir/client/sttp/ws/zio/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws
2 |
3 | package object zio extends TapirSttpClientZioWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm-2/sttp/tapir/client/sttp/ws/akkahttp/TapirSttpClientAkkaHttpWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws.akkahttp
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.akka.AkkaStreams
5 | import sttp.tapir.client.sttp.WebSocketToPipe
6 |
7 | import scala.concurrent.ExecutionContext
8 |
9 | trait TapirSttpClientAkkaHttpWebSockets {
10 | implicit def webSocketsSupportedForAkkaStreams(implicit ec: ExecutionContext): WebSocketToPipe[AkkaStreams with WebSockets] =
11 | new WebSocketToAkkaPipe[AkkaStreams with WebSockets]
12 | }
13 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm-2/sttp/tapir/client/sttp/ws/akkahttp/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws
2 |
3 | package object akkahttp extends TapirSttpClientAkkaHttpWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm/sttp/tapir/client/sttp/EndpointToSttpClientExtensions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp
2 |
3 | import sttp.model.StatusCode
4 |
5 | private[sttp] trait EndpointToSttpClientExtensions { this: EndpointToSttpClient[_] =>
6 |
7 | /** This needs to be platform-specific due to #2663, as on JS we don't get access to the 101 status code. */
8 | val webSocketSuccessStatusCode: StatusCode = StatusCode.SwitchingProtocols
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm/sttp/tapir/client/sttp/ws/fs2/TapirSttpClientFs2WebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws.fs2
2 |
3 | import cats.effect.Concurrent
4 | import sttp.capabilities.WebSockets
5 | import sttp.capabilities.fs2.Fs2Streams
6 | import sttp.tapir.client.sttp.WebSocketToPipe
7 |
8 | trait TapirSttpClientFs2WebSockets {
9 | implicit def webSocketsSupportedForFs2Streams[F[_]: Concurrent]: WebSocketToPipe[Fs2Streams[F] with WebSockets] =
10 | new WebSocketToFs2Pipe[F, Fs2Streams[F] with WebSockets]
11 | }
12 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm/sttp/tapir/client/sttp/ws/fs2/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws
2 |
3 | package object fs2 extends TapirSttpClientFs2WebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm/sttp/tapir/client/sttp/ws/pekkohttp/TapirSttpClientPekkoHttpWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws.pekkohttp
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.pekko.PekkoStreams
5 | import sttp.tapir.client.sttp.WebSocketToPipe
6 |
7 | import scala.concurrent.ExecutionContext
8 |
9 | trait TapirSttpClientPekkoHttpWebSockets {
10 | implicit def webSocketsSupportedForPekkoStreams(implicit ec: ExecutionContext): WebSocketToPipe[PekkoStreams with WebSockets] =
11 | new WebSocketToPekkoPipe[PekkoStreams with WebSockets]
12 | }
13 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm/sttp/tapir/client/sttp/ws/pekkohttp/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws
2 |
3 | package object pekkohttp extends TapirSttpClientPekkoHttpWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm/sttp/tapir/client/sttp/ws/zio/TapirSttpClientZioWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws.zio
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.zio.ZioStreams
5 | import sttp.tapir.client.sttp.WebSocketToPipe
6 |
7 | trait TapirSttpClientZioWebSockets {
8 | implicit val webSocketsSupportedForZioStreams: WebSocketToPipe[ZioStreams with WebSockets] =
9 | new WebSocketToZioPipe[ZioStreams with WebSockets]
10 | }
11 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalajvm/sttp/tapir/client/sttp/ws/zio/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp.ws
2 |
3 | package object zio extends TapirSttpClientZioWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client/src/main/scalanative/sttp/tapir/client/sttp/EndpointToSttpClientExtensions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp
2 |
3 | import sttp.model.StatusCode
4 |
5 | private[sttp] trait EndpointToSttpClientExtensions { this: EndpointToSttpClient[_] =>
6 |
7 | /** This needs to be platform-specific due to #2663, as on JS we don't get access to the 101 status code. */
8 | val webSocketSuccessStatusCode: StatusCode = StatusCode.SwitchingProtocols
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client/src/test/scala/sttp/tapir/client/sttp/SttpClientBasicTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp
2 |
3 | import sttp.tapir.client.tests.ClientBasicTests
4 |
5 | class SttpClientBasicTests extends SttpClientTests[Any] with ClientBasicTests {
6 | override def wsToPipe: WebSocketToPipe[Any] = implicitly
7 |
8 | tests()
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client/src/test/scala/sttp/tapir/client/sttp/SttpClientMultipartTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp
2 |
3 | import sttp.tapir.client.tests.ClientMultipartTests
4 |
5 | class SttpClientMultipartTests extends SttpClientTests[Any] with ClientMultipartTests {
6 | override def wsToPipe: WebSocketToPipe[Any] = implicitly
7 |
8 | multipartTests()
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client/src/test/scalajvm/sttp/tapir/client/sttp/SttpClientBasicZioTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp
2 |
3 | import sttp.tapir.client.tests.ClientBasicTests
4 |
5 | class SttpClientBasicZioTests extends SttpClientZioTests[Any] with ClientBasicTests {
6 | override def wsToPipe: WebSocketToPipe[Any] = implicitly
7 |
8 | tests()
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scala/sttp/tapir/client/sttp4/SttpClientOptions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4
2 |
3 | import sttp.tapir.{Defaults, TapirFile}
4 |
5 | case class SttpClientOptions(createFile: () => TapirFile)
6 |
7 | object SttpClientOptions {
8 | val default: SttpClientOptions = SttpClientOptions(Defaults.createTempFile)
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scala/sttp/tapir/client/sttp4/stream/StreamsNotWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.stream
2 |
3 | import sttp.capabilities.WebSockets
4 |
5 | // Type class to ensure S extends Streams[S] but NOT WebSockets
6 | trait StreamsNotWebSockets[S]
7 | object StreamsNotWebSockets {
8 | // This implicit is available if S does NOT extend WebSockets
9 | implicit def allowIfNotWebSockets[S]: StreamsNotWebSockets[S] = new StreamsNotWebSockets[S] {}
10 |
11 | // This implicit is triggered if S extends WebSockets, causing ambiguity
12 | implicit def disallowIfWebSockets[S <: WebSockets]: StreamsNotWebSockets[S] = ???
13 | }
14 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajs/sttp/tapir/client/sttp4/WebSocketEndpointToSttpClientExtensions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4
2 |
3 | import sttp.model.StatusCode
4 |
5 | private[sttp4] trait WebSocketEndpointToSttpClientExtensions {
6 |
7 | /** This needs to be platform-specific due to #2663, as on JS we don't get access to the 101 status code. */
8 | val webSocketSuccessStatusCode: StatusCode = StatusCode.Ok
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajs/sttp/tapir/client/sttp4/ws/fs2/TapirSttpClientFs2WebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws.fs2
2 |
3 | import cats.effect.Concurrent
4 | import sttp.capabilities.WebSockets
5 | import sttp.capabilities.fs2.Fs2Streams
6 | import sttp.tapir.client.sttp4.WebSocketToPipe
7 |
8 | trait TapirSttpClientFs2WebSockets {
9 | implicit def webSocketsSupportedForFs2Streams[F[_]: Concurrent]: WebSocketToPipe[Fs2Streams[F] with WebSockets] =
10 | new WebSocketToFs2Pipe[F, Fs2Streams[F] with WebSockets]
11 | }
12 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajs/sttp/tapir/client/sttp4/ws/fs2/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws
2 |
3 | package object fs2 extends TapirSttpClientFs2WebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajs/sttp/tapir/client/sttp4/ws/zio/TapirSttpClientZioWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws.zio
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.zio.ZioStreams
5 | import sttp.tapir.client.sttp4.WebSocketToPipe
6 |
7 | trait TapirSttpClientZioWebSockets {
8 | implicit val webSocketsSupportedForZioStreams: WebSocketToPipe[ZioStreams with WebSockets] =
9 | new WebSocketToZioPipe[ZioStreams with WebSockets]
10 | }
11 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajs/sttp/tapir/client/sttp4/ws/zio/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws
2 |
3 | package object zio extends TapirSttpClientZioWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm-2/sttp/tapir/client/sttp4/ws/akkahttp/TapirSttpClientAkkaHttpWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws.akkahttp
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.akka.AkkaStreams
5 | import sttp.tapir.client.sttp4.WebSocketToPipe
6 |
7 | import scala.concurrent.ExecutionContext
8 |
9 | trait TapirSttpClientAkkaHttpWebSockets {
10 | implicit def webSocketsSupportedForAkkaStreams(implicit ec: ExecutionContext): WebSocketToPipe[AkkaStreams with WebSockets] =
11 | new WebSocketToAkkaPipe[AkkaStreams with WebSockets]
12 | }
13 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm-2/sttp/tapir/client/sttp4/ws/akkahttp/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws
2 |
3 | package object akkahttp extends TapirSttpClientAkkaHttpWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm/sttp/tapir/client/sttp4/WebSocketEndpointToSttpClientExtensions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4
2 |
3 | import sttp.model.StatusCode
4 |
5 | private[sttp4] trait WebSocketEndpointToSttpClientExtensions {
6 |
7 | /** This needs to be platform-specific due to #2663, as on JS we don't get access to the 101 status code. */
8 | val webSocketSuccessStatusCode: StatusCode = StatusCode.SwitchingProtocols
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm/sttp/tapir/client/sttp4/ws/fs2/TapirSttpClientFs2WebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws.fs2
2 |
3 | import cats.effect.Concurrent
4 | import sttp.capabilities.WebSockets
5 | import sttp.capabilities.fs2.Fs2Streams
6 | import sttp.tapir.client.sttp4.WebSocketToPipe
7 |
8 | trait TapirSttpClientFs2WebSockets {
9 | implicit def webSocketsSupportedForFs2Streams[F[_]: Concurrent]: WebSocketToPipe[Fs2Streams[F] with WebSockets] =
10 | new WebSocketToFs2Pipe[F, Fs2Streams[F] with WebSockets]
11 | }
12 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm/sttp/tapir/client/sttp4/ws/fs2/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws
2 |
3 | package object fs2 extends TapirSttpClientFs2WebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm/sttp/tapir/client/sttp4/ws/pekkohttp/TapirSttpClientPekkoHttpWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws.pekkohttp
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.pekko.PekkoStreams
5 | import sttp.tapir.client.sttp4.WebSocketToPipe
6 |
7 | import scala.concurrent.ExecutionContext
8 |
9 | trait TapirSttpClientPekkoHttpWebSockets {
10 | implicit def webSocketsSupportedForPekkoStreams(implicit ec: ExecutionContext): WebSocketToPipe[PekkoStreams with WebSockets] =
11 | new WebSocketToPekkoPipe[PekkoStreams with WebSockets]
12 | }
13 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm/sttp/tapir/client/sttp4/ws/pekkohttp/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws
2 |
3 | package object pekkohttp extends TapirSttpClientPekkoHttpWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm/sttp/tapir/client/sttp4/ws/zio/TapirSttpClientZioWebSockets.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws.zio
2 |
3 | import sttp.capabilities.WebSockets
4 | import sttp.capabilities.zio.ZioStreams
5 | import sttp.tapir.client.sttp4.WebSocketToPipe
6 |
7 | trait TapirSttpClientZioWebSockets {
8 | implicit val webSocketsSupportedForZioStreams: WebSocketToPipe[ZioStreams with WebSockets] =
9 | new WebSocketToZioPipe[ZioStreams with WebSockets]
10 | }
11 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalajvm/sttp/tapir/client/sttp4/ws/zio/package.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4.ws
2 |
3 | package object zio extends TapirSttpClientZioWebSockets
4 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/main/scalanative/sttp/tapir/client/sttp4/WebSocketEndpointToSttpClientExtensions.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4
2 |
3 | import sttp.model.StatusCode
4 |
5 | private[sttp4] trait WebSocketEndpointToSttpClientExtensions {
6 |
7 | /** This needs to be platform-specific due to #2663, as on JS we don't get access to the 101 status code. */
8 | val webSocketSuccessStatusCode: StatusCode = StatusCode.SwitchingProtocols
9 | }
10 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/test/scala/sttp/tapir/client/sttp4/SttpClientMultipartTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4
2 |
3 | import sttp.tapir.client.tests.ClientMultipartTests
4 |
5 | class SttpClientMultipartTests extends SttpClientTestsSender with ClientMultipartTests {
6 | multipartTests()
7 | }
8 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/test/scala/sttp/tapir/client/sttp4/SttpClientSimpleTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4
2 |
3 | import sttp.tapir.client.tests.ClientBasicTests
4 |
5 | class SttpClientSimpleTests extends SttpClientTestsSender with ClientBasicTests {
6 | tests()
7 | }
8 |
--------------------------------------------------------------------------------
/client/sttp-client4/src/test/scalajvm/sttp/tapir/client/sttp4/SttpClientZioTests.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.sttp4
2 |
3 | import sttp.tapir.client.tests.ClientBasicTests
4 |
5 | class SttpClientZioTests extends SttpClientZioTestsSender with ClientBasicTests {
6 | tests()
7 | }
8 |
--------------------------------------------------------------------------------
/client/tests/src/main/scalajs/sttp/tapir/client/tests/ClientTestsPlatform.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.tests
2 |
3 | import cats.effect.unsafe.IORuntime
4 | import scala.concurrent.ExecutionContext
5 |
6 | object ClientTestsPlatform {
7 | // Using the default ScalaTest execution context seems to cause issues on JS.
8 | // https://github.com/scalatest/scalatest/issues/1039
9 | val executionContext: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global
10 | val ioRT: IORuntime = cats.effect.unsafe.implicits.global
11 |
12 | val platformIsScalaJS: Boolean = true
13 | val platformIsScalaNative: Boolean = false
14 | }
15 |
--------------------------------------------------------------------------------
/client/tests/src/main/scalajvm/sttp/tapir/client/tests/ClientTestsPlatform.scala:
--------------------------------------------------------------------------------
1 | package sttp.tapir.client.tests
2 |
3 | import cats.effect.unsafe.IORuntime
4 | import scala.concurrent.ExecutionContext
5 |
6 | object ClientTestsPlatform {
7 | // Using the default ScalaTest execution context seems to cause issues on JS.
8 | // https://github.com/scalatest/scalatest/issues/1039
9 | val executionContext: ExecutionContext = scala.concurrent.ExecutionContext.Implicits.global
10 | val ioRT: IORuntime = cats.effect.unsafe.implicits.global
11 |
12 | val platformIsScalaJS: Boolean = false
13 | val platformIsScalaNative: Boolean = false
14 | }
15 |
--------------------------------------------------------------------------------
/client/testserver/src/main/resources/logback.xml:
--------------------------------------------------------------------------------
1 |
2 |
Path requested: .
12 | 13 | -------------------------------------------------------------------------------- /files/src/main/scalajs/sttp/tapir/files/TapirStaticContentEndpoints.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.files 2 | 3 | trait TapirStaticContentEndpoints 4 | -------------------------------------------------------------------------------- /files/src/main/scalanative/sttp/tapir/files/TapirStaticContentEndpoints.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.files 2 | 3 | trait TapirStaticContentEndpoints 4 | -------------------------------------------------------------------------------- /generated-doc/out/.gitignore: -------------------------------------------------------------------------------- 1 | _build 2 | _build_html -------------------------------------------------------------------------------- /generated-doc/out/.python-version: -------------------------------------------------------------------------------- 1 | 3.12 2 | -------------------------------------------------------------------------------- /generated-doc/out/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = python -msphinx 7 | SPHINXPROJ = tapir 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /generated-doc/out/adopters/adobe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/adobe.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/broad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/broad.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/colisweb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/colisweb.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/ematiq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/ematiq.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/fugo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/fugo.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/hootsuite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/hootsuite.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/hunters.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/hunters.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/iceo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/iceo.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/kaizo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/kaizo.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/kelkoogroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/kelkoogroup.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/kensu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/kensu.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/moia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/moia.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/moneyfarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/moneyfarm.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/ocado.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/ocado.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/process_street.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/process_street.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/softwaremill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/softwaremill.png -------------------------------------------------------------------------------- /generated-doc/out/adopters/swissborg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/adopters/swissborg.png -------------------------------------------------------------------------------- /generated-doc/out/generate.md: -------------------------------------------------------------------------------- 1 | # Generate a Tapir project 2 | 3 | Not sure how to start? 4 | 5 | We recommend the defaults below (Direct-style stack & Netty server); this requires Java 21+. Otherwise, 6 | you might also try the Future stack + Netty, which works on Java 11+. 7 | 8 | If you'd like to include a JSON endpoint, using the [jsoniter](https://github.com/plokhotnyuk/jsoniter-scala) library 9 | might a good choice! 10 | 11 | ```{eval-rst} 12 | .. raw:: html 13 | 14 | 21 | ``` 22 | -------------------------------------------------------------------------------- /generated-doc/out/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/softwaremill/tapir/36e7493eedb12ed5d6a9f41ec81e303fd7017034/generated-doc/out/logo.png -------------------------------------------------------------------------------- /generated-doc/out/other/adr.md: -------------------------------------------------------------------------------- 1 | # Architecture Decision Records 2 | 3 | ADRs covering some of Tapir's design decisions are available in the `adr` directory of the repository. They are [available here](https://github.com/softwaremill/tapir/tree/master/doc/adr). -------------------------------------------------------------------------------- /generated-doc/out/other/troubleshooting.md: -------------------------------------------------------------------------------- 1 | # Troubleshooting 2 | 3 | ## StackOverflowException during compilation 4 | 5 | Sidenote for scala 2.12.4 and higher: if you encounter an issue with compiling your project because of 6 | a `StackOverflowException` related to [this](https://github.com/scala/bug/issues/10604) scala bug, 7 | please increase your stack memory. Example: 8 | 9 | ``` 10 | sbt -J-Xss4M clean compile 11 | ``` 12 | 13 | ## Logging of generated macros code 14 | For some cases, it may be helpful to examine how generated macros code looks like. 15 | To do that, just set an environmental variable and check compilation logs for details. 16 | 17 | ``` 18 | export TAPIR_LOG_GENERATED_CODE=true 19 | ``` 20 | -------------------------------------------------------------------------------- /generated-doc/out/quickstart.md: -------------------------------------------------------------------------------- 1 | # Quickstart 2 | 3 | To use tapir, add the following dependency to your project: 4 | 5 | ```scala 6 | "com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.33" 7 | ``` 8 | 9 | This will import only the core classes needed to create endpoint descriptions. To generate a server or a client, you 10 | will need to add further dependencies. 11 | 12 | Many of tapir functionalities come as builder methods in the main package, hence it's easiest to work with tapir if 13 | you import the main package entirely, i.e.: 14 | 15 | ```scala 16 | import sttp.tapir.* 17 | ``` 18 | 19 | Finally, type: 20 | 21 | ```scala 22 | endpoint. 23 | ``` 24 | 25 | and see where auto-complete gets you! 26 | 27 | -------------------------------------------------------------------------------- /generated-doc/out/requirements.txt: -------------------------------------------------------------------------------- 1 | sphinx_rtd_theme==2.0.0 2 | sphinx==7.3.7 3 | sphinx-autobuild==2024.4.16 4 | myst-parser==2.0.0 5 | -------------------------------------------------------------------------------- /generated-doc/out/watch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | sphinx-autobuild . _build/html 3 | -------------------------------------------------------------------------------- /grpc/examples/src/main/protobuf/simple_books_example.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_multiple_files = true; 4 | option java_package = "sttp.tapir.grpc.examples.grpc_simple_books_example.gen"; 5 | 6 | service Library { 7 | rpc AddBook (AddBookMsg) returns (SimpleBook) {} 8 | } 9 | 10 | message SimpleBook { 11 | int32 id = 1; 12 | string title = 2; 13 | string description = 3; 14 | } 15 | 16 | message AddBookMsg { 17 | string title = 1; 18 | string description = 2; 19 | } -------------------------------------------------------------------------------- /grpc/pbdirect/src/main/scala/sttp/tapir/grpc/protobuf/pbdirect/pbdirect.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf 2 | 3 | package object pbdirect extends TapirProtobufPbDirect 4 | -------------------------------------------------------------------------------- /grpc/pekko-examples/src/main/protobuf/simple_books_example.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | option java_multiple_files = true; 4 | option java_package = "sttp.tapir.grpc.examples.grpc_simple_books_example.gen"; 5 | 6 | service Library { 7 | rpc AddBook (AddBookMsg) returns (SimpleBook) {} 8 | } 9 | 10 | message SimpleBook { 11 | int32 id = 1; 12 | string title = 2; 13 | string description = 3; 14 | } 15 | 16 | message AddBookMsg { 17 | string title = 1; 18 | string description = 2; 19 | } -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/ProtobufAttributes.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf 2 | 3 | import sttp.tapir.AttributeKey 4 | 5 | object ProtobufAttributes { 6 | val ScalarValueAttribute = new AttributeKey[ProtobufScalarType]("scalar-type") 7 | } 8 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/model/Protobuf.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf.model 2 | 3 | final case class Protobuf(messages: List[ProtobufMessage], services: List[ProtobufService], options: ProtobufOptions) 4 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/model/ProtobufMessage.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf.model 2 | 3 | import sttp.tapir.grpc.protobuf.ProtobufMessageRef 4 | 5 | sealed trait ProtobufMessage { 6 | def name: MessageName 7 | } 8 | 9 | case class ProtobufProductMessage(name: MessageName, fields: Iterable[ProtobufMessageField]) extends ProtobufMessage 10 | case class ProtobufCoproductMessage(name: MessageName, alternatives: Iterable[ProtobufMessageField]) extends ProtobufMessage 11 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/model/ProtobufMessageField.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf.model 2 | 3 | import sttp.tapir.grpc.protobuf.ProtobufType 4 | 5 | //Simplified model for PoC, should be used only for scalar values 6 | case class ProtobufMessageField( 7 | `type`: ProtobufType, 8 | name: String, 9 | maybeId: Option[Int] 10 | ) 11 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/model/ProtobufOptions.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf.model 2 | 3 | case class ProtobufOptions(maybePackageName: Option[PackageName]) 4 | 5 | object ProtobufOptions { 6 | val empty: ProtobufOptions = ProtobufOptions(None) 7 | } 8 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/model/ProtobufService.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf.model 2 | 3 | case class ProtobufService(name: ServiceName, methods: List[ProtobufServiceMethod]) 4 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/model/ProtobufServiceMethod.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf.model 2 | 3 | case class ProtobufServiceMethod(name: MethodName, input: MessageReference, output: MessageReference) 4 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/model/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf 2 | 3 | package object model { 4 | type MessageName = String 5 | type ServiceName = String 6 | type MethodName = String 7 | type MessageReference = String 8 | type PackageName = String 9 | 10 | } 11 | -------------------------------------------------------------------------------- /grpc/protobuf/src/main/scala/sttp/tapir/grpc/protobuf/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc 2 | 3 | package object protobuf {} 4 | -------------------------------------------------------------------------------- /grpc/protobuf/src/test/scala/sttp/tapir/grpc/protobuf/ProtobufMatchers.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.grpc.protobuf 2 | 3 | import org.scalatest.Assertion 4 | import org.scalatest.matchers.should.Matchers 5 | 6 | trait ProtobufMatchers extends Matchers { 7 | def matchProtos(result: String, expected: String): Assertion = 8 | result.filterNot(_.isWhitespace) shouldBe expected.filterNot(_.isWhitespace) 9 | } 10 | -------------------------------------------------------------------------------- /integrations/cats/src/main/scala/sttp/tapir/integ/cats/ExampleInstances.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | import cats.Functor 4 | import sttp.tapir.EndpointIO.Example 5 | 6 | trait ExampleInstances { 7 | implicit val exampleFunctor: Functor[Example] = new Functor[Example] { 8 | override def map[A, B](example: Example[A])(f: A => B): Example[B] = example.map(f) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /integrations/cats/src/main/scala/sttp/tapir/integ/cats/ModifyFunctorInstances.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | import cats.data.{Chain, NonEmptyChain, NonEmptyList, NonEmptySet} 4 | import sttp.tapir._ 5 | 6 | trait ModifyFunctorInstances { 7 | 8 | implicit def nonEmptyListModifyFuntor[A]: ModifyFunctor[NonEmptyList, A] = 9 | new ModifyFunctor[NonEmptyList, A] {} 10 | 11 | implicit def nonEmptySetModifyFunctor[A]: ModifyFunctor[NonEmptySet, A] = 12 | new ModifyFunctor[NonEmptySet, A] {} 13 | 14 | implicit def chainModifyFunctor[A]: ModifyFunctor[Chain, A] = 15 | new ModifyFunctor[Chain, A] {} 16 | 17 | implicit def nonEmptyChainModifyFunctor[A]: ModifyFunctor[NonEmptyChain, A] = 18 | new ModifyFunctor[NonEmptyChain, A] {} 19 | } 20 | -------------------------------------------------------------------------------- /integrations/cats/src/main/scala/sttp/tapir/integ/cats/ServerEndpointSyntax.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | import cats.~> 4 | import sttp.tapir.server.ServerEndpoint 5 | 6 | trait ServerEndpointSyntax { 7 | implicit class ServerEndpointImapK[R, F[_]](endpoint: ServerEndpoint[R, F]) { 8 | import MonadErrorSyntax._ 9 | 10 | def imapK[G[_]](fk: F ~> G)(gk: G ~> F): ServerEndpoint[R, G] = 11 | ServerEndpoint( 12 | endpoint.endpoint, 13 | securityLogic = monadError => (a: endpoint.SECURITY_INPUT) => fk(endpoint.securityLogic(monadError.imapK(gk)(fk))(a)), 14 | logic = monadError => (u: endpoint.PRINCIPAL) => (i: endpoint.INPUT) => fk(endpoint.logic(monadError.imapK(gk)(fk))(u)(i)) 15 | ) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /integrations/cats/src/main/scala/sttp/tapir/integ/cats/ValidatorCats.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | import cats.Foldable 4 | import sttp.tapir.Validator 5 | 6 | object ValidatorCats { 7 | 8 | def nonEmptyFoldable[F[_]: Foldable, T]: Validator[F[T]] = 9 | Validator.nonEmpty[T, List].contramap[F[T]](Foldable[F].toList) 10 | } 11 | -------------------------------------------------------------------------------- /integrations/cats/src/main/scala/sttp/tapir/integ/cats/codec.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | object codec extends TapirCodecCats 4 | -------------------------------------------------------------------------------- /integrations/cats/src/main/scala/sttp/tapir/integ/cats/instances.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | object instances extends ExampleInstances with EndpointIOInstances with ModifyFunctorInstances 4 | -------------------------------------------------------------------------------- /integrations/cats/src/main/scala/sttp/tapir/integ/cats/syntax.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | object syntax extends ServerEndpointSyntax with MonadErrorSyntax 4 | -------------------------------------------------------------------------------- /integrations/cats/src/test/scala/sttp/tapir/integ/cats/ModifyFunctorInstancesTestData.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.integ.cats 2 | 3 | import cats.data.{Chain, NonEmptyChain, NonEmptyList, NonEmptySet} 4 | 5 | // This needs to be in a separate file than ModifyFunctorInstancesTest as otherwise compiling for Scala 3 using Scala.JS 6 | // gives: 7 | // [error] |Cannot call macro class NonEmptyListWrapper defined in the same source file 8 | // [error] | This location contains code that was inlined from ModifyFunctorInstancesTest.scala:16 9 | 10 | case class NonEmptyListWrapper(f1: NonEmptyList[String]) 11 | case class NonEmptySetWrapper(f1: NonEmptySet[String]) 12 | case class ChainWrapper(f1: Chain[String]) 13 | case class NonEmptyChainWrapper(f1: NonEmptyChain[String]) 14 | -------------------------------------------------------------------------------- /integrations/enumeratum/src/main/scala/sttp/tapir/codec/enumeratum/enumeratum.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec 2 | 3 | package object enumeratum extends TapirCodecEnumeratum 4 | -------------------------------------------------------------------------------- /integrations/iron/src/main/scala/sttp/iron/codec/iron/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec 2 | 3 | package object iron extends TapirCodecIron 4 | -------------------------------------------------------------------------------- /integrations/iron/src/test/scala-3/sttp/iron/codec/iron/RefinedInt.scala: -------------------------------------------------------------------------------- 1 | package sttp.iron.codec.iron 2 | 3 | import io.github.iltotore.iron.* 4 | import io.github.iltotore.iron.constraint.all.* 5 | 6 | type RefinedIntConstraint = Interval.ClosedOpen[0, 10] 7 | object RefinedInt extends RefinedType[Int, RefinedIntConstraint] 8 | type RefinedInt = RefinedInt.T 9 | -------------------------------------------------------------------------------- /integrations/monix-newtype/src/main/scala/sttp/tapir/codec/monix/newtype/newtype.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec.monix 2 | 3 | package object newtype extends TapirCodecMonixNewType 4 | -------------------------------------------------------------------------------- /integrations/newtype/src/main/scala/sttp/tapir/codec/newtype/TapirCodecNewType.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec.newtype 2 | 3 | import io.estatico.newtype.Coercible 4 | import sttp.tapir._ 5 | 6 | trait TapirCodecNewType { 7 | implicit def schemaForNewType[A, B](implicit ev: Coercible[Schema[A], Schema[B]], schema: Schema[A]): Schema[B] = ev(schema) 8 | 9 | implicit def codecForNewType[L, A, B, CF <: CodecFormat](implicit 10 | ev1: Coercible[A, B], 11 | ev2: Coercible[B, A], 12 | codec: Codec[L, A, CF] 13 | ): Codec[L, B, CF] = codec.map(ev1(_))(ev2(_)) 14 | } 15 | -------------------------------------------------------------------------------- /integrations/newtype/src/main/scala/sttp/tapir/codec/newtype/newtype.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec 2 | 3 | package object newtype extends TapirCodecNewType 4 | -------------------------------------------------------------------------------- /integrations/refined/src/main/scala/sttp/tapir/codec/refined/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec 2 | 3 | package object refined extends TapirCodecRefined 4 | -------------------------------------------------------------------------------- /integrations/zio-prelude/src/main/scala-2/sttp/tapir/codec/zio/prelude/newtype/TapirNewtypeSupport.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec.zio.prelude.newtype 2 | 3 | import sttp.tapir._ 4 | import zio.prelude.Newtype 5 | 6 | trait TapirNewtypeSupport[A] { self: Newtype[A] => 7 | implicit def tapirCodec[L, CF <: CodecFormat](implicit codec: Codec[L, A, CF]): Codec[L, Type, CF] = 8 | TapirNewtype[A, self.type](self).tapirCodec 9 | 10 | implicit def tapirSchema(implicit schema: Schema[A]): Schema[Type] = 11 | TapirNewtype[A, self.type](self).tapirSchema 12 | } 13 | -------------------------------------------------------------------------------- /integrations/zio-prelude/src/main/scala-3/sttp/tapir/codec/zio/prelude/newtype/TapirNewtypeSupport.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec.zio.prelude.newtype 2 | 3 | import sttp.tapir._ 4 | import zio.prelude.NewtypeCustom 5 | 6 | trait TapirNewtypeSupport[A] { self: NewtypeCustom[A] => 7 | implicit def tapirCodec[L, CF <: CodecFormat](implicit codec: Codec[L, A, CF]): Codec[L, Type, CF] = 8 | TapirNewtype[A, self.type](self).tapirCodec 9 | 10 | implicit def tapirSchema(implicit schema: Schema[A]): Schema[Type] = 11 | TapirNewtype[A, self.type](self).tapirSchema 12 | } 13 | -------------------------------------------------------------------------------- /integrations/zio-prelude/src/test/scala-2/sttp/tapir/codec/zio/prelude/newtype/TapirNewtypeTestFixture.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec.zio.prelude.newtype 2 | 3 | import zio.prelude.Assertion.{divisibleBy, endsWith, greaterThan, startsWith} 4 | import zio.prelude.{Newtype, Subtype} 5 | 6 | object TapirNewtypeTestFixture { 7 | object StringNewtype extends Newtype[String] { 8 | override def assertion = assert(startsWith("foo") && endsWith("baz")) 9 | } 10 | type StringNewtype = StringNewtype.Type 11 | 12 | object IntSubtype extends Subtype[Int] { 13 | override def assertion = assert(divisibleBy(2) && greaterThan(5)) 14 | } 15 | type IntSubtype = IntSubtype.Type 16 | } 17 | -------------------------------------------------------------------------------- /integrations/zio-prelude/src/test/scala-3/sttp/tapir/codec/zio/prelude/newtype/PalindromeValidator.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codec.zio.prelude.newtype 2 | 3 | import zio.prelude.{Validator, AssertionError} 4 | 5 | object PalindromeValidator 6 | extends Validator[String](str => if (str.reverse == str) Right(()) else Left(AssertionError.failure("isPalindrome"))) 7 | -------------------------------------------------------------------------------- /integrations/zio/src/main/scala/sttp/tapir/ztapir/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir 2 | 3 | package object ztapir extends Tapir with ZTapir 4 | -------------------------------------------------------------------------------- /integrations/zio/src/test/scala/sttp/tapir/ztapir/TestError.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.ztapir 2 | 3 | import sttp.tapir.CodecFormat.TextPlain 4 | import sttp.tapir.{Codec, DecodeResult} 5 | 6 | sealed trait TestError 7 | 8 | object TestError { 9 | case object SomeError extends TestError 10 | 11 | implicit val codec: Codec[String, TestError, TextPlain] = Codec.string.mapDecode { 12 | case "SomeError" => DecodeResult.Value(SomeError: TestError) 13 | case value => DecodeResult.Error(value, new RuntimeException(s"Unable to decode value $value")) 14 | }(_.toString) 15 | } 16 | -------------------------------------------------------------------------------- /json/circe/src/main/scala/sttp/tapir/json/circe/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object circe extends TapirJsonCirce 4 | -------------------------------------------------------------------------------- /json/json4s/src/main/scala/sttp/tapir/json/json4s/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object json4s extends TapirJson4s 4 | -------------------------------------------------------------------------------- /json/jsoniter/src/main/scala/sttp/tapir/json/jsoniter/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object jsoniter extends TapirJsonJsoniter 4 | -------------------------------------------------------------------------------- /json/pickler/src/main/scala/sttp/tapir/json/pickler/UpickleHelpers.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json.pickler 2 | 3 | private[pickler] trait UpickleHelpers: 4 | def scanChildren[T, V](xs: Seq[T])(f: T => V) = // copied from uPickle 5 | var x: V = null.asInstanceOf[V] 6 | val i = xs.iterator 7 | while (x == null && i.hasNext) { 8 | val t = f(i.next()) 9 | if (t != null) x = t 10 | } 11 | x 12 | -------------------------------------------------------------------------------- /json/pickler/src/main/scala/sttp/tapir/json/pickler/generic.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json.pickler.generic 2 | 3 | import sttp.tapir.json.pickler.Pickler 4 | import sttp.tapir.json.pickler.PicklerConfiguration 5 | 6 | import scala.reflect.ClassTag 7 | import scala.deriving.Mirror 8 | 9 | /** Import `sttp.tapir.json.pickler.auto.*`` for automatic generic pickler derivation. A [[Pickler]] will be derived at the usage side using 10 | * [[Pickler.derived]] for each type where a given `Pickler` is not available in the current given/implicit scope. 11 | */ 12 | object auto { 13 | inline implicit def picklerForCaseClass[T: ClassTag](implicit m: Mirror.Of[T], c: PicklerConfiguration): Pickler[T] = Pickler.derived[T] 14 | } 15 | -------------------------------------------------------------------------------- /json/pickler/src/main/scala/sttp/tapir/json/pickler/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json.pickler 2 | 3 | import sttp.tapir._ 4 | 5 | def jsonBody[T: Pickler]: EndpointIO.Body[String, T] = stringBodyUtf8AnyFormat(summon[Pickler[T]].toCodec) 6 | 7 | def jsonBodyWithRaw[T: Pickler]: EndpointIO.Body[String, (String, T)] = stringBodyUtf8AnyFormat( 8 | Codec.tupledWithRaw(summon[Pickler[T]].toCodec) 9 | ) 10 | 11 | def jsonQuery[T: Pickler](name: String): EndpointInput.Query[T] = 12 | queryAnyFormat[T, CodecFormat.Json](name, Codec.jsonQuery(summon[Pickler[T]].toCodec)) 13 | -------------------------------------------------------------------------------- /json/playjson/src/main/scala/sttp/tapir/json/play/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object play extends TapirJsonPlay 4 | -------------------------------------------------------------------------------- /json/playjson/src/test/scalajs/sttp/tapir/json/play/TapirJsonPlayTestExtensions.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json.play 2 | 3 | trait TapirJsonPlayTestExtensions 4 | -------------------------------------------------------------------------------- /json/sprayjson/src/main/scala/sttp/tapir/json/spray/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object spray extends TapirJsonSpray 4 | -------------------------------------------------------------------------------- /json/tethys/src/main/scala/sttp/tapir/json/tethys/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object tethys extends TapirJsonTethys 4 | -------------------------------------------------------------------------------- /json/upickle/src/main/scala/sttp/tapir/json/upickle/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object upickle extends TapirJsonuPickle 4 | -------------------------------------------------------------------------------- /json/upickle/src/test/scalajs/sttp/tapir/json/upickle/TapirJsonuPickleTestExtensions.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json.upickle 2 | 3 | trait TapirJsonuPickleTestExtensions 4 | -------------------------------------------------------------------------------- /json/upickle/src/test/scalanative/sttp/tapir/json/upickle/TapirJsonuPickleTestExtensions.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json.upickle 2 | 3 | trait TapirJsonuPickleTestExtensions 4 | -------------------------------------------------------------------------------- /json/zio/src/main/scala/sttp/tapir/json/zio/package.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.json 2 | 3 | package object zio extends TapirJsonZio 4 | -------------------------------------------------------------------------------- /openapi-codegen/cli/src/main/scala/sttp/tapir/codegen/Main.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codegen 2 | 3 | import cats.effect.{ExitCode, IO} 4 | import com.monovore.decline.Opts 5 | import com.monovore.decline.effect.CommandIOApp 6 | 7 | object Main 8 | extends CommandIOApp( 9 | BuildInfo.name, 10 | "Tapir Command Line Tools", 11 | true, 12 | version = BuildInfo.version 13 | ) { 14 | 15 | override def main: Opts[IO[ExitCode]] = 16 | Opts.subcommand(GenScala.cmd) 17 | 18 | } 19 | -------------------------------------------------------------------------------- /openapi-codegen/cli/tapir-codegen.json: -------------------------------------------------------------------------------- 1 | { 2 | "repositories": [ 3 | "central" 4 | ], 5 | "dependencies": [ 6 | "com.softwaremill::tapir-codegen:latest.release" 7 | ] 8 | } -------------------------------------------------------------------------------- /openapi-codegen/core/src/main/scala/sttp/tapir/codegen/YamlParser.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codegen 2 | 3 | import sttp.tapir.codegen.openapi.models.OpenapiModels.OpenapiDocument 4 | import io.circe.yaml.parser 5 | 6 | object YamlParser { 7 | import cats.implicits._ 8 | import io.circe._ 9 | 10 | def parseFile(yamlString: String): Either[Error, OpenapiDocument] = { 11 | parser 12 | .parse(yamlString) 13 | .leftMap(err => err: Error) 14 | .flatMap(_.as[OpenapiDocument]) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /openapi-codegen/core/src/main/scala/sttp/tapir/codegen/openapi/models/GenerationDirectives.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codegen.openapi.models 2 | 3 | object GenerationDirectives { 4 | val extensionKey = "tapir-codegen-directives" 5 | val jsonBodyAsString = "json-body-as-string" 6 | val securityPrefixKey = "tapir-codegen-security-path-prefixes" 7 | } 8 | -------------------------------------------------------------------------------- /openapi-codegen/core/src/main/scala/sttp/tapir/codegen/openapi/models/OpenapiXml.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codegen.openapi.models 2 | 3 | object OpenapiXml { 4 | sealed trait XmlConfiguration 5 | final case class XmlArrayConfiguration(name: Option[String] = None, wrapped: Option[Boolean] = None, itemName: Option[String] = None) 6 | extends XmlConfiguration { 7 | def isWrapped: Boolean = wrapped.contains(true) 8 | } 9 | final case class XmlObjectConfiguration(name: Option[String], prefix: Option[String], namespace: Option[String]) extends XmlConfiguration 10 | final case class XmlItemConfiguration(name: Option[String], attribute: Option[Boolean]) extends XmlConfiguration 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/core/src/main/scala/sttp/tapir/codegen/util/ErrUtils.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codegen.util 2 | 3 | case class Location(path: String, method: String) { 4 | override def toString: String = s"${method.toUpperCase} ${path}" 5 | } 6 | 7 | object ErrUtils { 8 | def bail(msg: String)(implicit location: Location): Nothing = throw new NotImplementedError(s"$msg at $location") 9 | } 10 | -------------------------------------------------------------------------------- /openapi-codegen/core/src/main/scala/sttp/tapir/codegen/util/MapUtils.scala: -------------------------------------------------------------------------------- 1 | package sttp.tapir.codegen.util 2 | 3 | object MapUtils { 4 | 5 | def merge[A, B](m1: Map[A, Seq[B]], m2: Map[A, Seq[B]]): Map[A, Seq[B]] = 6 | m2.iterator.foldLeft(m1) { case (m, (k, v)) => 7 | m.get(k) match { 8 | case Some(value) => m + (k -> (value ++ v)) 9 | case None => m + (k -> v) 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/README.md: -------------------------------------------------------------------------------- 1 | ### Developer notes 2 | 3 | #### Testing 4 | ``` 5 | sbt 6 | project openapiCodegen2_12 7 | test 8 | scripted 9 | ``` 10 | 11 | #### Local debugging 12 | ``` 13 | cd sbt/sbt-openapi-codegen/src/sbt-test/sbt-openapi-codegen/minimal/ 14 | sbt -Dplugin.version=0.1-SNAPSHOT run 15 | cat target/swagger.yaml 16 | cat target/scala-2.13/classes/sttp/tapir/generated/TapirGeneratedEndpoints.scala 17 | ``` 18 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/caching/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > run 3 | > check 4 | $ copy-file target/scala-2.13/src_managed/main/sbt-openapi-codegen/TapirGeneratedEndpoints.scala target/TapirGeneratedEndpoints.scala 5 | > compile 6 | $ newer target/TapirGeneratedEndpoints.scala target/scala-2.13/src_managed/main/sbt-openapi-codegen/TapirGeneratedEndpoints.scala 7 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/minimal/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > check 5 | 6 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/multi_file/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/multi_file/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/multi_file/src/main/scala/Main.scala: -------------------------------------------------------------------------------- 1 | object Main extends App { 2 | import sttp.apispec.openapi.circe.yaml._ 3 | import sttp.tapir.generated.swagger.{TapirGeneratedEndpoints => TGE1} 4 | import sttp.tapir.generated.swagger2.{TapirGeneratedEndpoints => TGE2} 5 | import sttp.tapir.docs.openapi._ 6 | 7 | val docs = OpenAPIDocsInterpreter().toOpenAPI(TGE1.generatedEndpoints ++ TGE2.generatedEndpoints, "My Bookshop", "1.0") 8 | 9 | import java.nio.file.{Paths, Files} 10 | import java.nio.charset.StandardCharsets 11 | 12 | Files.write(Paths.get("target/swagger.yaml"), docs.toYaml.getBytes(StandardCharsets.UTF_8)) 13 | } 14 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/multi_file/swagger2.yaml: -------------------------------------------------------------------------------- 1 | openapi: 3.1.0 2 | info: 3 | title: My Bookshop 4 | version: '1.0' 5 | paths: 6 | /books: 7 | put: 8 | operationId: putBooksGenreYear 9 | requestBody: 10 | content: 11 | application/json: 12 | schema: 13 | $ref: '#/components/schemas/Book' 14 | responses: 15 | '204': 16 | description: OK 17 | components: 18 | schemas: 19 | Book: 20 | title: Book 21 | required: 22 | - title 23 | type: object 24 | properties: 25 | title: 26 | type: string 27 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/multi_file/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > check 5 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip-zio/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.9.9 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip-zio/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip-zio/src/main/scala/Main.scala: -------------------------------------------------------------------------------- 1 | object Main extends App { 2 | import sttp.apispec.openapi.circe.yaml._ 3 | import sttp.tapir.generated._ 4 | import sttp.tapir.docs.openapi._ 5 | 6 | val docs = OpenAPIDocsInterpreter().toOpenAPI(TapirGeneratedEndpoints.generatedEndpoints, "My Bookshop", "1.0") 7 | 8 | import java.nio.file.{Paths, Files} 9 | import java.nio.charset.StandardCharsets 10 | 11 | Files.write(Paths.get("target/swagger.yaml"), docs.toYaml.getBytes(StandardCharsets.UTF_8)) 12 | } 13 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip-zio/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > test 5 | > check 6 | 7 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/src/main/scala/Main.scala: -------------------------------------------------------------------------------- 1 | object Main extends App { 2 | import sttp.apispec.openapi.circe.yaml._ 3 | import sttp.tapir.generated._ 4 | import sttp.tapir.docs.openapi._ 5 | 6 | val docs = OpenAPIDocsInterpreter().toOpenAPI(TapirGeneratedEndpoints.generatedEndpoints, "My Bookshop", "1.0") 7 | 8 | import java.nio.file.{Paths, Files} 9 | import java.nio.charset.StandardCharsets 10 | 11 | Files.write(Paths.get("target/swagger.yaml"), docs.toYaml.getBytes(StandardCharsets.UTF_8)) 12 | } 13 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/src/test/scala/ServerSpec.scala: -------------------------------------------------------------------------------- 1 | import org.scalatest.freespec.AnyFreeSpec 2 | import org.scalatest.matchers.should.Matchers 3 | import sttp.tapir.generated.TapirGeneratedEndpoints._ 4 | 5 | class ServerSpec extends AnyFreeSpec with Matchers { 6 | 7 | "can construct uri with default values" in { 8 | Servers.`https://{environment}.my-co.org:{port}/api/{customer}/prefix`.uri().toString() shouldEqual 9 | "https://prod.my-co.org:1234/api/big-dogs/prefix" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > test 5 | > check 6 | 7 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/src/main/scala/Main.scala: -------------------------------------------------------------------------------- 1 | object Main extends App { 2 | import sttp.apispec.openapi.circe.yaml._ 3 | import sttp.tapir.generated._ 4 | import sttp.tapir.docs.openapi._ 5 | 6 | val docs = OpenAPIDocsInterpreter().toOpenAPI(TapirGeneratedEndpoints.generatedEndpoints, "My Bookshop", "1.0") 7 | 8 | import java.nio.file.{Paths, Files} 9 | import java.nio.charset.StandardCharsets 10 | 11 | Files.write(Paths.get("target/swagger.yaml"), docs.toYaml.getBytes(StandardCharsets.UTF_8)) 12 | } 13 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > test 5 | > check 6 | 7 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/src/main/scala/Main.scala: -------------------------------------------------------------------------------- 1 | object Main extends App { 2 | import sttp.apispec.openapi.circe.yaml._ 3 | import sttp.tapir.generated._ 4 | import sttp.tapir.docs.openapi._ 5 | 6 | val docs = OpenAPIDocsInterpreter().toOpenAPI(TapirGeneratedEndpoints.generatedEndpoints, "My Bookshop", "1.0") 7 | 8 | import java.nio.file.{Paths, Files} 9 | import java.nio.charset.StandardCharsets 10 | 11 | Files.write(Paths.get("target/swagger.yaml"), docs.toYaml.getBytes(StandardCharsets.UTF_8)) 12 | } 13 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_jsoniter_scala3/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > test 5 | > check 6 | 7 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/src/main/scala/Main.scala: -------------------------------------------------------------------------------- 1 | object Main extends App { 2 | import sttp.apispec.openapi.circe.yaml._ 3 | import sttp.tapir.generated._ 4 | import sttp.tapir.docs.openapi._ 5 | 6 | val docs = OpenAPIDocsInterpreter().toOpenAPI(TapirGeneratedEndpoints.generatedEndpoints, "My Bookshop", "1.0") 7 | 8 | import java.nio.file.{Paths, Files} 9 | import java.nio.charset.StandardCharsets 10 | 11 | Files.write(Paths.get("target/swagger.yaml"), docs.toYaml.getBytes(StandardCharsets.UTF_8)) 12 | } 13 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/src/test/scala/ServerSpec.scala: -------------------------------------------------------------------------------- 1 | import org.scalatest.freespec.AnyFreeSpec 2 | import org.scalatest.matchers.should.Matchers 3 | import sttp.tapir.generated.TapirGeneratedEndpoints._ 4 | 5 | class ServerSpec extends AnyFreeSpec with Matchers { 6 | 7 | "can construct uri with default values" in { 8 | Servers.`https://{environment}.my-co.org:{port}/api/{customer}/prefix`.uri().toString() shouldEqual 9 | "https://prod.my-co.org:1234/api/big-dogs/prefix" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/oneOf-json-roundtrip_scala3/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > test 5 | > check 6 | 7 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/option-overrides/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > check 5 | 6 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/petstore/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version=1.11.0 2 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/petstore/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | { 2 | val pluginVersion = System.getProperty("plugin.version") 3 | if (pluginVersion == null) 4 | throw new RuntimeException("""| 5 | | 6 | |The system property 'plugin.version' is not defined. 7 | |Specify this property using the scriptedLaunchOpts -D. 8 | | 9 | |""".stripMargin) 10 | else addSbtPlugin("com.softwaremill.sttp.tapir" % "sbt-openapi-codegen" % pluginVersion) 11 | } 12 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/petstore/src/main/scala/Main.scala: -------------------------------------------------------------------------------- 1 | object Main extends App { 2 | import sttp.apispec.openapi.circe.yaml._ 3 | import sttp.tapir.generated._ 4 | import sttp.tapir.docs.openapi._ 5 | 6 | val docs = 7 | OpenAPIDocsInterpreter().toOpenAPI(TapirGeneratedEndpoints.generatedEndpoints, "Swagger Petstore - OpenAPI 3.0", "1.0.27-SNAPSHOT") 8 | 9 | import java.nio.file.{Paths, Files} 10 | import java.nio.charset.StandardCharsets 11 | 12 | Files.write(Paths.get("target/swagger.yaml"), docs.toYaml.getBytes(StandardCharsets.UTF_8)) 13 | } 14 | -------------------------------------------------------------------------------- /openapi-codegen/sbt-plugin/src/sbt-test/sbt-openapi-codegen/petstore/test: -------------------------------------------------------------------------------- 1 | > clean 2 | > generateTapirDefinitions 3 | > run 4 | > test 5 | > check 6 | 7 | -------------------------------------------------------------------------------- /perf-tests/results/100users-1min-18-03-2022-local-adamw.md: -------------------------------------------------------------------------------- 1 | # Setup 2 | 3 | 2019 mbp, 2,3 GHz 8-Core Intel Core i9 4 | 5 | # Results 6 | 7 | * vanilla akka-http, multi-route: 23278 req/s 8 | * tapir akka-http, multi-route: 8277 req/s 9 | 10 | ## After introducing `FilterServerEndpoints` 11 | 12 | * vanilla akka-http, multi-route: 25531 req/s 13 | * tapir akka-http, multi-route: 45407 req/s -------------------------------------------------------------------------------- /perf-tests/src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 |