Skip to content

Commit b4f016e

Browse files
Moving over to the dynamically generated Args and Context pojos
1 parent a48d027 commit b4f016e

File tree

8 files changed

+142
-95
lines changed

8 files changed

+142
-95
lines changed

modules/cli/src/main/scala/dev/guardrail/cli/CLICommon.scala

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import dev.guardrail._
99
import dev.guardrail.core.{ LogLevel, LogLevels }
1010
import dev.guardrail.terms.protocol.PropertyRequirement
1111
import dev.guardrail.runner.GuardrailRunner
12+
import dev.guardrail.syntax.args._
1213

1314
case class CommandLineResult(exitStatus: Int)
1415

@@ -93,7 +94,7 @@ trait CLICommon extends GuardrailRunner {
9394
def expandTilde(path: String): String =
9495
path.replaceFirst("^~", System.getProperty("user.home"))
9596
val defaultArgs =
96-
Args.empty.copy(context = Args.empty.context, defaults = true)
97+
Args.empty.withDefaults(true)
9798

9899
type From = (List[Args], List[String])
99100
type To = List[Args]
@@ -105,7 +106,7 @@ trait CLICommon extends GuardrailRunner {
105106
.filter(_.defaults)
106107
.lastOption
107108
.getOrElse(defaultArgs)
108-
.copy(defaults = false)
109+
.withDefaults(false)
109110
def Continue(x: From): Target[Either[From, To]] = Target.pure(Either.left(x))
110111
def Return(x: To): Target[Either[From, To]] = Target.pure(Either.right(x))
111112
def Bail(x: Error): Target[Either[From, To]] = Target.raiseError(x)
@@ -116,29 +117,29 @@ trait CLICommon extends GuardrailRunner {
116117
debug("Finished") >> Return(already)
117118
case (Nil, xs @ (_ :: _)) => Continue((empty :: Nil, xs))
118119
case (sofar :: already, "--defaults" :: xs) =>
119-
Continue((empty.copy(defaults = true) :: sofar :: already, xs))
120+
Continue((empty.withDefaults(true) :: sofar :: already, xs))
120121
case (sofar :: already, "--client" :: xs) =>
121122
Continue((empty :: sofar :: already, xs))
122123
case (sofar :: already, "--server" :: xs) =>
123-
Continue((empty.copy(kind = CodegenTarget.Server) :: sofar :: already, xs))
124+
Continue((empty.withKind(CodegenTarget.Server) :: sofar :: already, xs))
124125
case (sofar :: already, "--models" :: xs) =>
125-
Continue((empty.copy(kind = CodegenTarget.Models) :: sofar :: already, xs))
126+
Continue((empty.withKind(CodegenTarget.Models) :: sofar :: already, xs))
126127
case (sofar :: already, "--framework" :: value :: xs) =>
127128
Continue((sofar.copyContext(framework = Some(value)) :: already, xs))
128129
case (sofar :: already, "--help" :: xs) =>
129-
Continue((sofar.copy(printHelp = true) :: already, List.empty))
130+
Continue((sofar.withPrintHelp(true) :: already, List.empty))
130131
case (sofar :: already, "--specPath" :: value :: xs) =>
131-
Continue((sofar.copy(specPath = Option(expandTilde(value))) :: already, xs))
132+
Continue((sofar.withSpecPath(Option(expandTilde(value))) :: already, xs))
132133
case (sofar :: already, "--tracing" :: xs) =>
133134
Continue((sofar.copyContext(tracing = true) :: already, xs))
134135
case (sofar :: already, "--outputPath" :: value :: xs) =>
135-
Continue((sofar.copy(outputPath = Option(expandTilde(value))) :: already, xs))
136+
Continue((sofar.withOutputPath(Option(expandTilde(value))) :: already, xs))
136137
case (sofar :: already, "--packageName" :: value :: xs) =>
137-
Continue((sofar.copy(packageName = Option(value.trim.split('.').toList)) :: already, xs))
138+
Continue((sofar.withPackageName(Option(value.trim.split('.').toList)) :: already, xs))
138139
case (sofar :: already, "--dtoPackage" :: value :: xs) =>
139-
Continue((sofar.copy(dtoPackage = value.trim.split('.').toList) :: already, xs))
140+
Continue((sofar.withDtoPackage(value.trim.split('.').toList) :: already, xs))
140141
case (sofar :: already, "--import" :: value :: xs) =>
141-
Continue((sofar.copy(imports = sofar.imports :+ value) :: already, xs))
142+
Continue((sofar.withImports(sofar.imports :+ value) :: already, xs))
142143
case (sofar :: already, "--module" :: value :: xs) =>
143144
Continue((sofar.copyContext(modules = sofar.context.modules :+ value) :: already, xs))
144145
case (sofar :: already, "--custom-extraction" :: xs) =>

modules/core/src/main/scala/dev/guardrail/Args.scala

Lines changed: 0 additions & 57 deletions
This file was deleted.

modules/core/src/main/scala/dev/guardrail/Context.scala

Lines changed: 0 additions & 25 deletions
This file was deleted.

modules/core/src/main/scala/dev/guardrail/core/CoreTermInterp.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import dev.guardrail.generators.Framework
2121
import dev.guardrail.languages.LA
2222
import dev.guardrail.terms._
2323
import dev.guardrail.terms.protocol.PropertyRequirement
24+
import dev.guardrail.syntax.args._
2425

2526
class CoreTermInterp[L <: LA](
2627
val defaultFramework: String,
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package dev.guardrail.syntax
2+
3+
import dev.guardrail.terms.protocol.PropertyRequirement
4+
import dev.guardrail.{ Args, AuthImplementation, CodegenTarget, Context, TagsBehaviour }
5+
import dev.guardrail.syntax.context._
6+
7+
/* Syntax for `dev.guardrail.Args`
8+
* Args is a dynamically generated pojo, defined in
9+
* project/src/main/scala/modules/core.scala ,
10+
* using functions from
11+
* project/src/main/scala/interop .
12+
*/
13+
object args {
14+
implicit class ArgsCompanionSyntax(args: Args.type) {
15+
val empty: Args = new Args(CodegenTarget.Client, Option.empty, Option.empty, Option.empty, List.empty, false, Context.empty, false, List.empty)
16+
def isEmpty: Args => Boolean = { args =>
17+
args.specPath.isEmpty &&
18+
args.outputPath.isEmpty &&
19+
args.packageName.isEmpty &&
20+
!args.printHelp
21+
}
22+
}
23+
24+
implicit class ArgsSyntax(args: Args) {
25+
def copyContext(
26+
framework: Option[String] = args.context.framework,
27+
customExtraction: Boolean = args.context.customExtraction,
28+
tracing: Boolean = args.context.tracing,
29+
modules: List[String] = args.context.modules,
30+
propertyRequirement: PropertyRequirement.Configured = args.context.propertyRequirement,
31+
tagsBehaviour: TagsBehaviour = args.context.tagsBehaviour,
32+
authImplementation: AuthImplementation = args.context.authImplementation
33+
): Args =
34+
args.withContext(
35+
args.context
36+
.withFramework(framework)
37+
.withCustomExtraction(customExtraction)
38+
.withTracing(tracing)
39+
.withModules(modules)
40+
.withPropertyRequirement(propertyRequirement)
41+
.withTagsBehaviour(tagsBehaviour)
42+
.withAuthImplementation(authImplementation)
43+
)
44+
45+
def copyPropertyRequirement(
46+
encoder: PropertyRequirement.OptionalRequirement = args.context.propertyRequirement.encoder,
47+
decoder: PropertyRequirement.OptionalRequirement = args.context.propertyRequirement.decoder
48+
): Args =
49+
copyContext(
50+
propertyRequirement = args.context.propertyRequirement.copy(
51+
encoder = encoder,
52+
decoder = decoder
53+
)
54+
)
55+
}
56+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package dev.guardrail.syntax
2+
3+
import dev.guardrail.{ AuthImplementation, Context, TagsBehaviour }
4+
import dev.guardrail.terms.protocol.PropertyRequirement
5+
6+
/* Syntax for `dev.guardrail.Context`
7+
* Context is a dynamically generated pojo, defined in
8+
* project/src/main/scala/modules/core.scala ,
9+
* using functions from
10+
* project/src/main/scala/interop .
11+
*/
12+
object context {
13+
implicit class ContextCompanionSyntax(args: Context.type) {
14+
val empty: Context = Context(
15+
None,
16+
customExtraction = false,
17+
tracing = false,
18+
modules = List.empty,
19+
propertyRequirement = PropertyRequirement.Configured(PropertyRequirement.OptionalLegacy, PropertyRequirement.OptionalLegacy),
20+
tagsBehaviour = TagsBehaviour.TagsAreIgnored,
21+
authImplementation = AuthImplementation.Disable
22+
)
23+
}
24+
}

modules/microsite/src/main/scala/DocsHelpers.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import scala.meta._
88

99
import dev.guardrail._
1010
import dev.guardrail.core.Tracker
11+
import dev.guardrail.syntax.context._
1112
import dev.guardrail.generators.Framework
1213
import dev.guardrail.generators.scala.ScalaLanguage
1314
import dev.guardrail.terms.protocol.StaticDefns

project/src/main/scala/modules/core.scala

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,55 @@
11
package dev.guardrail.sbt.modules
22

33
import dev.guardrail.sbt.Build._
4+
import dev.guardrail.sbt.interop.InteropKeys
5+
import dev.guardrail.sbt.interop.InteropTasks
46

57
import sbt._
68
import sbt.Keys._
79

810
object core {
9-
val catsVersion = "2.10.0"
11+
val catsVersion = "2.10.0"
1012

11-
val project =
13+
// Generate POJOs with convenience methods for the following classes:
14+
def emitSources(sourceManagedPath: java.io.File): List[(scala.meta.Source, java.io.File)] = {
15+
import _root_.scala.meta._
16+
List(
17+
(
18+
InteropTasks.buildPOJO(
19+
t"dev.guardrail.Args",
20+
List(
21+
param"kind: dev.guardrail.CodegenTarget",
22+
param"specPath: Option[String]",
23+
param"outputPath: Option[String]",
24+
param"packageName: Option[List[String]]",
25+
param"dtoPackage: List[String]",
26+
param"printHelp: Boolean",
27+
param"context: Context",
28+
param"defaults: Boolean",
29+
param"imports: List[String]",
30+
)
31+
),
32+
sourceManagedPath / "dev" / "guardrail" / "Args.scala"
33+
),
34+
(
35+
InteropTasks.buildPOJO(
36+
t"dev.guardrail.Context",
37+
List(
38+
param"framework: Option[String]",
39+
param"customExtraction: Boolean",
40+
param"tracing: Boolean",
41+
param"modules: List[String]",
42+
param"propertyRequirement: dev.guardrail.terms.protocol.PropertyRequirement.Configured",
43+
param"tagsBehaviour: dev.guardrail.TagsBehaviour",
44+
param"authImplementation: dev.guardrail.AuthImplementation",
45+
)
46+
),
47+
sourceManagedPath / "dev" / "guardrail" / "Context.scala"
48+
)
49+
)
50+
}
51+
52+
val project =
1253
commonModule("core")
1354
.settings(
1455
libraryDependencies ++= Seq(
@@ -20,5 +61,10 @@ object core {
2061
"org.typelevel" %% "cats-kernel" % catsVersion,
2162
"org.scala-lang.modules" %% "scala-java8-compat" % "1.0.2",
2263
).map(_.cross(CrossVersion.for3Use2_13)),
64+
Compile / sourceGenerators += InteropKeys.generateTask,
65+
InteropKeys.generateTask := {
66+
val sourceManagedPath = (Compile / sourceManaged).value
67+
InteropTasks.writeFiles(emitSources(sourceManagedPath)),
68+
}
2369
)
2470
}

0 commit comments

Comments
 (0)