Created
November 10, 2017 09:02
-
-
Save danslapman/09952b5f3fe3f0289c824f8eb43861f2 to your computer and use it in GitHub Desktop.
Custom atom
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ru.tinkoff.testApi | |
import akka.actor.ActorSystem | |
import akka.http.scaladsl.Http | |
import akka.stream.ActorMaterializer | |
import io.circe.generic.JsonCodec | |
import ru.tinkoff.tschema.akkaHttp.{MkRoute, Serve} | |
import ru.tinkoff.tschema.swagger.SwaggerTypeable | |
import ru.tinkoff.tschema.typeDSL.DSLAtom | |
import shapeless.{HList, Witness} | |
import ru.tinkoff.tschema.swagger._ | |
import ru.tinkoff.tschema.syntax._ | |
import de.heikoseeberger.akkahttpcirce.FailFastCirceSupport._ | |
import ru.tinkoff.testApi.VersionApp.route | |
@JsonCodec | |
case class Filters(foo: Option[String], bar: Option[Int]) | |
object Filters { | |
implicit def swagger: SwaggerTypeable[Filters] = SwaggerTypeable.deriveNamedTypeable[Filters] | |
} | |
final class extractFilters[name] extends DSLAtom | |
object extractFilters { | |
def apply[name](w: Witness.Lt[name]): extractFilters[name] = new extractFilters | |
implicit def filtersSwagger[name] = | |
(queryParam[Option[String]]('foo) |> queryParam[Option[Int]]('bar)).swaggerMapper.as[extractFilters[name]] | |
import akka.http.scaladsl.server.Directives._ | |
implicit def filtersServe[name <: Symbol, In <: HList] = | |
Serve.serveAdd[extractFilters[name], In, Filters, name] { | |
parameters('foo.?, 'bar.as[Int].?).tmap { case (foo, bar) => Tuple1(Filters(foo, bar)) } | |
} | |
} | |
object FiltersApp extends App { | |
def api = keyPrefix('echo) |> extractFilters('filt) |> get[Filters] | |
object handler { | |
def echo(filt: Filters) = filt | |
} | |
implicit val system = ActorSystem() | |
implicit val mat = ActorMaterializer() | |
import akka.http.scaladsl.server.Directives._ | |
import system.dispatcher | |
val route = pathPrefix("api") { MkRoute(api)(handler) } ~ | |
pathPrefix("swagger")(get( | |
complete(api.mkSwagger.make(OpenApiInfo())) | |
)) | |
for (_ <- Http().bindAndHandle(route, "localhost", 8081)) | |
println("server started at http://localhost:8081") | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment