diff --git a/project/PathRef.scala b/project/PathRef.scala deleted file mode 100644 index 45539c5..0000000 --- a/project/PathRef.scala +++ /dev/null @@ -1,32 +0,0 @@ -import sbt.io.Hash -import sbt.util.FileInfo -import sbt.util.HashFileInfo -import sjsonnew.* - -import java.io.File - -case class PathRef(path: os.Path) - -object PathRef { - - def apply(f: File): PathRef = PathRef(os.Path(f)) - - implicit val pathFormat: JsonFormat[PathRef] = - BasicJsonProtocol.projectFormat[PathRef, HashFileInfo]( - p => - if (os.isFile(p.path)) FileInfo.hash(p.path.toIO) - else - // If the path is a directory, we get the hashes of all files - // then hash the concatenation of the hash's bytes. - FileInfo.hash( - p.path.toIO, - Hash( - os.walk(p.path) - .map(_.toIO) - .map(Hash(_)) - .foldLeft(Array.emptyByteArray)(_ ++ _) - ) - ), - hash => PathRef(hash.file) - ) -} diff --git a/project/SmithyTraitCodegen.scala b/project/SmithyTraitCodegen.scala deleted file mode 100644 index 551d51d..0000000 --- a/project/SmithyTraitCodegen.scala +++ /dev/null @@ -1,127 +0,0 @@ -import sbt.* -import sbt.io.IO -import software.amazon.smithy.build.FileManifest -import software.amazon.smithy.build.PluginContext -import software.amazon.smithy.model.node.ArrayNode -import software.amazon.smithy.model.node.ObjectNode -import software.amazon.smithy.model.shapes.ShapeId -import software.amazon.smithy.model.Model -import software.amazon.smithy.traitcodegen.TraitCodegenPlugin - -import java.io.File -import java.nio.file.Paths -import java.util.UUID - -object SmithyTraitCodegen { - - import sjsonnew.* - - import BasicJsonProtocol.* - - case class Args( - javaPackage: String, - smithyNamespace: String, - targetDir: os.Path, - smithySourcesDir: PathRef, - dependencies: List[PathRef] - ) - object Args { - - // format: off - private type ArgsDeconstructed = String :*: String :*: os.Path :*: PathRef :*: List[PathRef] :*: LNil - // format: on - - private implicit val pathFormat: JsonFormat[os.Path] = - BasicJsonProtocol.projectFormat[os.Path, File](p => p.toIO, file => os.Path(file)) - - implicit val argsIso = - LList.iso[Args, ArgsDeconstructed]( - { args: Args => - ("javaPackage", args.javaPackage) :*: - ("smithyNamespace", args.smithyNamespace) :*: - ("targetDir", args.targetDir) :*: - ("smithySourcesDir", args.smithySourcesDir) :*: - ("dependencies", args.dependencies) :*: - LNil - }, - { - case (_, javaPackage) :*: - (_, smithyNamespace) :*: - (_, targetDir) :*: - (_, smithySourcesDir) :*: - (_, dependencies) :*: - LNil => - Args( - javaPackage = javaPackage, - smithyNamespace = smithyNamespace, - targetDir = targetDir, - smithySourcesDir = smithySourcesDir, - dependencies = dependencies - ) - } - ) - - } - - case class Output(metaDir: File, javaDir: File) - - object Output { - - // format: off - private type OutputDeconstructed = File :*: File :*: LNil - // format: on - - implicit val outputIso = - LList.iso[Output, OutputDeconstructed]( - { output: Output => - ("metaDir", output.metaDir) :*: - ("javaDir", output.javaDir) :*: - LNil - }, - { - case (_, metaDir) :*: - (_, javaDir) :*: - LNil => - Output( - metaDir = metaDir, - javaDir = javaDir - ) - } - ) - } - - def generate(args: Args): Output = { - val outputDir = args.targetDir / "smithy-trait-generator-output" - val genDir = outputDir / "java" - val metaDir = outputDir / "meta" - os.remove.all(outputDir) - List(outputDir, genDir, metaDir).foreach(os.makeDir.all(_)) - - val manifest = FileManifest.create(genDir.toNIO) - - val model = args.dependencies - .foldLeft(Model.assembler().addImport(args.smithySourcesDir.path.toNIO)) { case (acc, dep) => - acc.addImport(dep.path.toNIO) - } - .assemble() - .unwrap() - val context = PluginContext - .builder() - .model(model) - .fileManifest(manifest) - .settings( - ObjectNode - .builder() - .withMember("package", args.javaPackage) - .withMember("namespace", args.smithyNamespace) - .withMember("header", ArrayNode.builder.build()) - .withMember("excludeTags", ArrayNode.builder.withValue("nocodegen").build()) - .build() - ) - .build() - val plugin = new TraitCodegenPlugin() - plugin.execute(context) - os.move(genDir / "META-INF", metaDir / "META-INF") - Output(metaDir = metaDir.toIO, javaDir = genDir.toIO) - } -} diff --git a/project/SmithyTraitCodegenPlugin.scala b/project/SmithyTraitCodegenPlugin.scala deleted file mode 100644 index 78903f4..0000000 --- a/project/SmithyTraitCodegenPlugin.scala +++ /dev/null @@ -1,95 +0,0 @@ -import sbt.* -import sbt.plugins.JvmPlugin -import software.amazon.smithy.build.FileManifest -import software.amazon.smithy.build.PluginContext -import software.amazon.smithy.model.node.ArrayNode -import software.amazon.smithy.model.node.ObjectNode -import software.amazon.smithy.model.Model -import software.amazon.smithy.traitcodegen.TraitCodegenPlugin - -import Keys.* - -object SmithyTraitCodegenPlugin extends AutoPlugin { - override def trigger: PluginTrigger = noTrigger - override def requires: Plugins = JvmPlugin - - object autoImport { - val smithyTraitCodegenJavaPackage = - settingKey[String]("The java target package where the generated smithy traits will be created") - val smithyTraitCodegenNamespace = settingKey[String]("The smithy namespace where the traits are defined") - val smithyTraitCodegenDependencies = settingKey[List[ModuleID]]("Dependencies to be added into codegen model") - } - import autoImport.* - - override def projectSettings: Seq[Setting[?]] = - Seq( - Keys.generateSmithyTraits := Def.task { - import sbt.util.CacheImplicits.* - val s = (Compile / streams).value - val logger = sLog.value - - val report = update.value - val dependencies = smithyTraitCodegenDependencies.value - val jars = - dependencies.flatMap(m => - report.matching(moduleFilter(organization = m.organization, name = m.name, revision = m.revision)) - ) - require( - jars.size == dependencies.size, - "Not all dependencies required for smithy-trait-codegen have been found" - ) - - val args = SmithyTraitCodegen.Args( - javaPackage = smithyTraitCodegenJavaPackage.value, - smithyNamespace = smithyTraitCodegenNamespace.value, - targetDir = os.Path((Compile / target).value), - smithySourcesDir = PathRef((Compile / resourceDirectory).value / "META-INF" / "smithy"), - dependencies = jars.map(PathRef(_)).toList - ) - val cachedCodegen = - Tracked.inputChanged[SmithyTraitCodegen.Args, SmithyTraitCodegen.Output]( - s.cacheStoreFactory.make("smithy-trait-codegen-args") - ) { - Function.untupled( - Tracked - .lastOutput[(Boolean, SmithyTraitCodegen.Args), SmithyTraitCodegen.Output]( - s.cacheStoreFactory.make("smithy-trait-codegen-output") - ) { case ((inputChanged, codegenArgs), cached) => - cached - .filter(_ => !inputChanged) - .fold { - SmithyTraitCodegen.generate(codegenArgs) - } { last => - logger.info(s"Using cached result of smithy-trait-codegen") - last - } - } - ) - } - cachedCodegen(args) - }.value, - Compile / sourceGenerators += Def.task { - val codegenOutput = (Compile / Keys.generateSmithyTraits).value - cleanCopy(source = codegenOutput.javaDir, target = (Compile / sourceManaged).value / "java") - }, - Compile / resourceGenerators += Def.task { - val codegenOutput = (Compile / Keys.generateSmithyTraits).value - cleanCopy(source = codegenOutput.metaDir, target = (Compile / resourceManaged).value) - }.taskValue, - libraryDependencies ++= smithyTraitCodegenDependencies.value - ) - - private def cleanCopy(source: File, target: File) = { - val sourcePath = os.Path(source) - val targetPath = os.Path(target) - os.remove.all(targetPath) - os.copy(from = sourcePath, to = targetPath, createFolders = true) - os.walk(targetPath).map(_.toIO).filter(_.isFile()) - } - - object Keys { - val generateSmithyTraits = - taskKey[SmithyTraitCodegen.Output]("Run AWS smithy-trait-codegen on the protocol specs") - } - -} diff --git a/project/build.sbt b/project/build.sbt deleted file mode 100644 index 969768d..0000000 --- a/project/build.sbt +++ /dev/null @@ -1,4 +0,0 @@ -libraryDependencies ++= Seq( - "software.amazon.smithy" % "smithy-trait-codegen", - "software.amazon.smithy" % "smithy-model" -).map(_ % "1.58.0") diff --git a/project/plugins.sbt b/project/plugins.sbt index 1565eaa..b67ad15 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -16,4 +16,6 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.5.4") addSbtPlugin("com.disneystreaming.smithy4s" % "smithy4s-sbt-codegen" % "0.18.37") +addSbtPlugin("org.polyvariant" % "smithy-trait-codegen-sbt" % "0.2.2") + addDependencyTreePlugin