Skip to content

Commit

Permalink
issue-179: do not use Http4sDsl
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan Strnad committed Aug 12, 2019
1 parent 167649e commit c551657
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 10 deletions.
1 change: 1 addition & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ val exampleCases: List[(java.io.File, String, Boolean, List[String])] = List(
(sampleResource("issues/issue148.yaml"), "issues.issue148", false, List.empty),
(sampleResource("issues/issue164.yaml"), "issues.issue164", false, List.empty),
(sampleResource("issues/issue184.yaml"), "issues.issue184", false, List.empty),
(sampleResource("issues/issue179.yaml"), "issues.issue179", false, List.empty),
(sampleResource("issues/issue215.yaml"), "issues.issue215", false, List.empty),
(sampleResource("issues/issue218.yaml"), "issues.issue218", false, List.empty),
(sampleResource("issues/issue222.yaml"), "issues.issue222", false, List.empty),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,4 +95,11 @@ object Http4sHelper {
"""
case _ => q"EntityEncoder[F, String].contramap[$tpe](_.toString)"
}

def generateEntityResponseGenerator(term: Term.Ref): Term =
q"""
new org.http4s.dsl.impl.EntityResponseGenerator[F,F] {
def status = $term
}
"""
}
Original file line number Diff line number Diff line change
Expand Up @@ -471,9 +471,11 @@ object Http4sServerGenerator {
case Response(statusCodeName, valueType) =>
val responseTerm = Term.Name(s"${statusCodeName.value}")
valueType.fold[Case](
p"case $responseCompanionTerm.$responseTerm => ${statusCodeName}()"
p"case $responseCompanionTerm.$responseTerm => F.pure(Response[F](status = org.http4s.Status.${statusCodeName}))"
) { _ =>
p"case $responseCompanionTerm.$responseTerm(value) => ${statusCodeName}(value)(F, ${Term.Name(s"$operationId${statusCodeName}Encoder")})"
val generatorName = Term.Name(s"$operationId${statusCodeName}EntityResponseGenerator")
val encoderName = Term.Name(s"$operationId${statusCodeName}Encoder")
p"case $responseCompanionTerm.$responseTerm(value) => $generatorName(value)(F,$encoderName)"
}
}
q"$handlerCall flatMap ${Term.PartialFunction(marshallers)}"
Expand Down Expand Up @@ -512,7 +514,7 @@ object Http4sServerGenerator {
val routeBody = entityProcessor.fold[Term](responseInMatchInFor)(_.apply(responseInMatchInFor))

val fullRoute: Case =
p"""case req @ $fullRouteWithTracingMatcher =>
p"""case req @ $fullRouteWithTracingMatcher =>
mapRoute($operationId, req, {$routeBody})
"""

Expand Down Expand Up @@ -667,13 +669,14 @@ object Http4sServerGenerator {
responses: Responses[ScalaLanguage],
consumes: Seq[RouteMeta.ContentType],
produces: Seq[RouteMeta.ContentType]): List[Defn.Val] =
generateDecoders(operationId, bodyArgs, consumes) ++ generateEncoders(operationId, responses, produces)
generateDecoders(operationId, bodyArgs, consumes) ++ generateEncoders(operationId, responses, produces) ++ generateResponseGenerators(operationId,
responses)

def generateDecoders(operationId: String, bodyArgs: Option[ScalaParameter[ScalaLanguage]], consumes: Seq[RouteMeta.ContentType]): List[Defn.Val] =
bodyArgs.toList.flatMap {
case ScalaParameter(_, _, _, _, argType) =>
List(
q"val ${Pat.Typed(Pat.Var(Term.Name(s"${operationId}Decoder")), t"EntityDecoder[F, $argType]")} = ${Http4sHelper.generateDecoder(argType, consumes)}"
q"private[this] val ${Pat.Typed(Pat.Var(Term.Name(s"${operationId}Decoder")), t"EntityDecoder[F, $argType]")} = ${Http4sHelper.generateDecoder(argType, consumes)}"
)
}

Expand All @@ -683,7 +686,16 @@ object Http4sServerGenerator {
typeDefaultPair <- response.value
(tpe, _) = typeDefaultPair
} yield {
q"val ${Pat.Var(Term.Name(s"$operationId${response.statusCodeName}Encoder"))} = ${Http4sHelper.generateEncoder(tpe, produces)}"
q"private[this] val ${Pat.Var(Term.Name(s"$operationId${response.statusCodeName}Encoder"))} = ${Http4sHelper.generateEncoder(tpe, produces)}"
}

def generateResponseGenerators(operationId: String, responses: Responses[ScalaLanguage]): List[Defn.Val] =
for {
response <- responses.value
if response.value.nonEmpty
} yield {
q"private[this] val ${Pat.Var(Term.Name(s"$operationId${response.statusCodeName}EntityResponseGenerator"))} = ${Http4sHelper
.generateEntityResponseGenerator(q"org.http4s.Status.${response.statusCodeName}")}"
}

def generateTracingExtractor(operationId: String, tracingField: Term) =
Expand Down
6 changes: 3 additions & 3 deletions modules/codegen/src/test/scala/core/issues/Issue165.scala
Original file line number Diff line number Diff line change
Expand Up @@ -55,21 +55,21 @@ class Issue165 extends FunSuite with Matchers with SwaggerSpecRunner {
mapRoute("getRoot", req, {
handler.getRoot(GetRootResponse)() flatMap {
case GetRootResponse.Ok =>
Ok()
F.pure(Response[F](status = org.http4s.Status.Ok))
}
})
case req @ GET -> Root / "foo" =>
mapRoute("getFoo", req, {
handler.getFoo(GetFooResponse)() flatMap {
case GetFooResponse.Ok =>
Ok()
F.pure(Response[F](status = org.http4s.Status.Ok))
}
})
case req @ GET -> Root / "foo" / "" =>
mapRoute("getFooDir", req, {
handler.getFooDir(GetFooDirResponse)() flatMap {
case GetFooDirResponse.Ok =>
Ok()
F.pure(Response[F](status = org.http4s.Status.Ok))
}
})
}
Expand Down
2 changes: 1 addition & 1 deletion modules/codegen/src/test/scala/core/issues/Issue225.scala
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class Issue225 extends FunSuite with Matchers with SwaggerSpecRunner {
mapRoute("getRoot", req, {
handler.getRoot(GetRootResponse)(response) flatMap {
case GetRootResponse.Ok =>
Ok()
F.pure(Response[F](status = org.http4s.Status.Ok))
}
})
}
Expand Down
13 changes: 13 additions & 0 deletions modules/sample/src/main/resources/issues/issue179.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
swagger: '2.0'
info:
title: https://github.com/twilio/guardrail/issues/179
host: localhost:1234
schemes:
- http
paths:
/foo:
get:
operationId: getFoo
responses:
'401':
description: No content

0 comments on commit c551657

Please sign in to comment.