Skip to content

Commit 6c4b437

Browse files
committed
Add common smithy traits into protocol definition
1 parent e46c197 commit 6c4b437

File tree

5 files changed

+64
-9
lines changed

5 files changed

+64
-9
lines changed

build.sbt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,10 @@ val smithy = projectMatrix
9696
.enablePlugins(SmithyTraitCodegenPlugin)
9797
.settings(
9898
name := "jsonrpclib-smithy",
99-
commonJvmSettings
99+
commonJvmSettings,
100+
smithyTraitCodegenDependencies := List(Dependencies.alloy.core),
101+
smithyTraitCodegenJavaPackage := "jsonrpclib",
102+
smithyTraitCodegenNamespace := "jsonrpclib"
100103
)
101104

102105
lazy val buildTimeProtocolDependency =

modules/smithy/src/main/resources/META-INF/smithy/jsonrpclib.smithy

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ namespace jsonrpclib
77
@protocolDefinition(traits: [
88
jsonRequest
99
jsonNotification
10+
smithy.api#jsonName
11+
smithy.api#length
12+
smithy.api#pattern
13+
smithy.api#range
14+
smithy.api#required
15+
smithy.api#timestampFormat
16+
alloy#uuidFormat
17+
alloy#discriminated
18+
alloy#nullable
19+
alloy#untagged
1020
])
1121
@trait(selector: "service")
1222
structure jsonRPC {

project/Dependencies.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import sbt.*
2+
3+
object Dependencies {
4+
val alloy = new {
5+
val version = "0.3.20"
6+
val core = "com.disneystreaming.alloy" % "alloy-core" % version
7+
}
8+
}

project/SmithyTraitCodegen.scala

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,17 @@ object SmithyTraitCodegen {
1818

1919
import BasicJsonProtocol.*
2020

21-
case class Args(targetDir: os.Path, smithySourcesDir: PathRef, dependencies: List[PathRef])
21+
case class Args(
22+
javaPackage: String,
23+
smithyNamespace: String,
24+
targetDir: os.Path,
25+
smithySourcesDir: PathRef,
26+
dependencies: List[PathRef]
27+
)
2228
object Args {
2329

2430
// format: off
25-
private type ArgsDeconstructed = os.Path :*: PathRef :*: List[PathRef] :*: LNil
31+
private type ArgsDeconstructed = String :*: String :*: os.Path :*: PathRef :*: List[PathRef] :*: LNil
2632
// format: on
2733

2834
private implicit val pathFormat: JsonFormat[os.Path] =
@@ -31,17 +37,23 @@ object SmithyTraitCodegen {
3137
implicit val argsIso =
3238
LList.iso[Args, ArgsDeconstructed](
3339
{ args: Args =>
34-
("targetDir", args.targetDir) :*:
40+
("javaPackage", args.javaPackage) :*:
41+
("smithyNamespace", args.smithyNamespace) :*:
42+
("targetDir", args.targetDir) :*:
3543
("smithySourcesDir", args.smithySourcesDir) :*:
3644
("dependencies", args.dependencies) :*:
3745
LNil
3846
},
3947
{
40-
case (_, targetDir) :*:
48+
case (_, javaPackage) :*:
49+
(_, smithyNamespace) :*:
50+
(_, targetDir) :*:
4151
(_, smithySourcesDir) :*:
4252
(_, dependencies) :*:
4353
LNil =>
4454
Args(
55+
javaPackage = javaPackage,
56+
smithyNamespace = smithyNamespace,
4557
targetDir = targetDir,
4658
smithySourcesDir = smithySourcesDir,
4759
dependencies = dependencies
@@ -100,8 +112,8 @@ object SmithyTraitCodegen {
100112
.settings(
101113
ObjectNode
102114
.builder()
103-
.withMember("package", "jsonrpclib")
104-
.withMember("namespace", "jsonrpclib")
115+
.withMember("package", args.javaPackage)
116+
.withMember("namespace", args.smithyNamespace)
105117
.withMember("header", ArrayNode.builder.build())
106118
.withMember("excludeTags", ArrayNode.builder.withValue("nocodegen").build())
107119
.build()

project/SmithyTraitCodegenPlugin.scala

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,38 @@ object SmithyTraitCodegenPlugin extends AutoPlugin {
1313
override def trigger: PluginTrigger = noTrigger
1414
override def requires: Plugins = JvmPlugin
1515

16+
object autoImport {
17+
val smithyTraitCodegenJavaPackage =
18+
settingKey[String]("The java target package where the generated smithy traits will be created")
19+
val smithyTraitCodegenNamespace = settingKey[String]("The smithy namespace where the traits are defined")
20+
val smithyTraitCodegenDependencies = settingKey[List[ModuleID]]("Dependencies to be added into codegen model")
21+
}
22+
import autoImport.*
23+
1624
override def projectSettings: Seq[Setting[?]] =
1725
Seq(
1826
Keys.generateSmithyTraits := Def.task {
1927
import sbt.util.CacheImplicits.*
2028
val s = (Compile / streams).value
2129
val logger = sLog.value
30+
31+
val report = update.value
32+
val dependencies = smithyTraitCodegenDependencies.value
33+
val jars =
34+
dependencies.flatMap(m =>
35+
report.matching(moduleFilter(organization = m.organization, name = m.name, revision = m.revision))
36+
)
37+
require(
38+
jars.size == dependencies.size,
39+
"Not all dependencies required for smithy-trait-codegen have been found"
40+
)
41+
2242
val args = SmithyTraitCodegen.Args(
43+
javaPackage = smithyTraitCodegenJavaPackage.value,
44+
smithyNamespace = smithyTraitCodegenNamespace.value,
2345
targetDir = os.Path((Compile / target).value),
2446
smithySourcesDir = PathRef((Compile / resourceDirectory).value / "META-INF" / "smithy"),
25-
dependencies = List.empty
47+
dependencies = jars.map(PathRef(_)).toList
2648
)
2749
val cachedCodegen =
2850
Tracked.inputChanged[SmithyTraitCodegen.Args, SmithyTraitCodegen.Output](
@@ -54,7 +76,7 @@ object SmithyTraitCodegenPlugin extends AutoPlugin {
5476
val codegenOutput = (Compile / Keys.generateSmithyTraits).value
5577
cleanCopy(source = codegenOutput.metaDir, target = (Compile / resourceManaged).value)
5678
}.taskValue,
57-
libraryDependencies += "software.amazon.smithy" % "smithy-model" % "1.56.0"
79+
libraryDependencies ++= smithyTraitCodegenDependencies.value
5880
)
5981

6082
private def cleanCopy(source: File, target: File) = {

0 commit comments

Comments
 (0)