Skip to content

Commit 20fb0bc

Browse files
Merge pull request #142 from blast-hardcheese/moving-logic-into-free
Moving logic into free
2 parents cf4ed1a + 35214b7 commit 20fb0bc

File tree

87 files changed

+2158
-1902
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+2158
-1902
lines changed

build.sbt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ fullRunTask(
7474
)
7575

7676
artifact in (Compile, assembly) := {
77-
val art = (artifact in (Compile, assembly)).value
78-
art.copy(`classifier` = Some("assembly"))
77+
(artifact in (Compile, assembly)).value
78+
.withClassifier(Option("assembly"))
7979
}
8080

8181
addArtifact(artifact in (Compile, assembly), assembly)
@@ -88,7 +88,10 @@ addCommandAlias(
8888

8989
val resetSample = TaskKey[Unit]("resetSample", "Reset sample module")
9090

91-
resetSample := { "git clean -fdx modules/sample/src modules/sample/target" ! }
91+
resetSample := {
92+
import scala.sys.process._
93+
"git clean -fdx modules/sample/src modules/sample/target" !
94+
}
9295

9396
addCommandAlias("example", "; resetSample ; runExample ; sample/test")
9497
addCommandAlias("testSuite", "; codegen/test ; resetSample; runExample ; sample/test")
@@ -141,8 +144,7 @@ val codegenSettings = Seq(
141144
"utf8"
142145
),
143146
parallelExecution in Test := true,
144-
fork := true,
145-
offline := true
147+
fork := true
146148
)
147149

148150
lazy val root = (project in file("."))

modules/codegen/src/main/scala/com/twilio/guardrail/CLI.scala

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import cats.~>
99
import com.twilio.guardrail.core.CoreTermInterp
1010
import com.twilio.guardrail.terms.CoreTerm
1111
import com.twilio.swagger.core.{ LogLevel, LogLevels }
12-
import com.twilio.guardrail.generators.GeneratorSettings
1312

1413
import scala.io.AnsiColor
1514

@@ -22,11 +21,11 @@ object CLICommon {
2221
args.span(arg => LogLevels(arg.stripPrefix("--")).isDefined)
2322
val level: Option[String] = levels.lastOption.map(_.stripPrefix("--"))
2423

25-
val fallback = List.empty[(GeneratorSettings, ReadSwagger[Target[List[WriteTree]]])]
24+
val fallback = List.empty[ReadSwagger[Target[List[WriteTree]]]]
2625
val result = Common
2726
.runM[CoreTerm](newArgs)
2827
.foldMap(interpreter)
29-
.fold[List[(GeneratorSettings, ReadSwagger[Target[List[WriteTree]]])]](
28+
.fold[List[ReadSwagger[Target[List[WriteTree]]]]](
3029
{
3130
case MissingArg(args, Error.ArgName(arg)) =>
3231
println(s"${AnsiColor.RED}Missing argument:${AnsiColor.RESET} ${AnsiColor.BOLD}${arg}${AnsiColor.RESET} (In block ${args})")
@@ -66,22 +65,20 @@ object CLICommon {
6665
print(coreLogger.show)
6766

6867
val (logger, paths) = deferred
69-
.traverse({
70-
case (generatorSettings, rs) =>
71-
ReadSwagger
72-
.readSwagger(rs)
73-
.fold(
74-
{ err =>
75-
println(s"${AnsiColor.RED}${err}${AnsiColor.RESET}")
76-
Applicative[Settings].pure(List.empty[Path])
77-
},
78-
_.fold({ err =>
79-
println(s"${AnsiColor.RED}Error: ${err}${AnsiColor.RESET}")
80-
unsafePrintHelp()
81-
List.empty[Path]
82-
}, _.map(WriteTree.unsafeWriteTree))
83-
)
84-
.run(generatorSettings)
68+
.traverse({ rs =>
69+
ReadSwagger
70+
.readSwagger(rs)
71+
.fold(
72+
{ err =>
73+
println(s"${AnsiColor.RED}${err}${AnsiColor.RESET}")
74+
Applicative[Logger].pure(List.empty[Path])
75+
},
76+
_.fold({ err =>
77+
println(s"${AnsiColor.RED}Error: ${err}${AnsiColor.RESET}")
78+
unsafePrintHelp()
79+
List.empty[Path]
80+
}, _.map(WriteTree.unsafeWriteTree))
81+
)
8582
})
8683
.map(_.flatten)
8784
.run

modules/codegen/src/main/scala/com/twilio/guardrail/ClientGenerator.scala

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import cats.free.Free
55
import cats.instances.all._
66
import cats.syntax.all._
77
import com.twilio.guardrail.protocol.terms.client.ClientTerms
8-
import com.twilio.guardrail.languages.ScalaLanguage
98
import com.twilio.guardrail.languages.LA
9+
import com.twilio.guardrail.generators.Http4sHelper
10+
import com.twilio.guardrail.terms.framework.FrameworkTerms
11+
import com.twilio.guardrail.terms.{ RouteMeta, ScalaTerms, SwaggerTerms }
1012

1113
import scala.collection.JavaConverters._
12-
import com.twilio.guardrail.terms.RouteMeta
1314

1415
case class Clients[L <: LA](clients: List[Client[L]])
1516
case class Client[L <: LA](pkg: List[String],
@@ -29,21 +30,34 @@ object ClientGenerator {
2930
host: Option[String],
3031
basePath: Option[String],
3132
groupedRoutes: List[(List[String], List[RouteMeta])]
32-
)(protocolElems: List[StrictProtocolElems[L]])(implicit C: ClientTerms[L, F]): Free[F, Clients[L]] = {
33+
)(protocolElems: List[StrictProtocolElems[L]])(implicit C: ClientTerms[L, F], Fw: FrameworkTerms[L, F], Sc: ScalaTerms[L, F], Sw: SwaggerTerms[L, F]): Free[F, Clients[L]] = {
3334
import C._
35+
import Sw._
3436
for {
3537
clientImports <- getImports(context.tracing)
3638
clientExtraImports <- getExtraImports(context.tracing)
3739
clients <- groupedRoutes.traverse({
38-
case (pkg, routes) =>
40+
case (className, unsortedRoutes) =>
41+
val routes = unsortedRoutes.sortBy(r => (r.path, r.method))
42+
val clientName = s"${className.lastOption.getOrElse("").capitalize}Client"
43+
def splitOperationParts(operationId: String): (List[String], String) = {
44+
val parts = operationId.split('.')
45+
(parts.drop(1).toList, parts.last)
46+
}
47+
3948
for {
40-
responseDefinitions <- routes.flatTraverse {
41-
case RouteMeta(path, method, operation) =>
42-
generateResponseDefinitions(operation, protocolElems)
49+
responseClientPair <- routes.traverse {
50+
case route @ RouteMeta(path, method, operation) =>
51+
for {
52+
operationId <- getOperationId(operation)
53+
responses <- Http4sHelper.getResponses[L, F](operationId, operation, protocolElems)
54+
responseDefinitions <- generateResponseDefinitions(operationId, responses, protocolElems)
55+
parameters <- route.getParameters[L, F](protocolElems)
56+
clientOp <- generateClientOperation(className, context.tracing, parameters)(route, operationId, responses)
57+
} yield (responseDefinitions, clientOp)
4358
}
44-
clientOperations <- routes.traverse(generateClientOperation(pkg, context.tracing, protocolElems) _)
45-
clientName = s"${pkg.lastOption.getOrElse("").capitalize}Client"
46-
tracingName = Option(pkg.mkString("-")).filterNot(_.isEmpty)
59+
(responseDefinitions, clientOperations) = responseClientPair.unzip
60+
tracingName = Option(className.mkString("-")).filterNot(_.isEmpty)
4761
ctorArgs <- clientClsArgs(tracingName, schemes, host, context.tracing)
4862
companion <- buildCompanion(clientName, tracingName, schemes, host, ctorArgs, context.tracing)
4963
client <- buildClient(
@@ -58,7 +72,7 @@ object ClientGenerator {
5872
context.tracing
5973
)
6074
} yield {
61-
Client[L](pkg, clientName, (clientImports ++ frameworkImports ++ clientExtraImports), companion, client, responseDefinitions)
75+
Client[L](className, clientName, (clientImports ++ frameworkImports ++ clientExtraImports), companion, client, responseDefinitions.flatten)
6276
}
6377
})
6478
} yield Clients[L](clients)

0 commit comments

Comments
 (0)