diff --git a/src/main/java/io/vertx/starter/model/Language.java b/src/main/java/io/vertx/starter/model/Language.java index 530e7507..d28cb632 100644 --- a/src/main/java/io/vertx/starter/model/Language.java +++ b/src/main/java/io/vertx/starter/model/Language.java @@ -25,7 +25,10 @@ public enum Language { JAVA("java", ".java"), @JsonProperty("kotlin") - KOTLIN("kotlin", ".kt", "vertx-lang-kotlin"); + KOTLIN("kotlin", ".kt", "vertx-lang-kotlin"), + + @JsonProperty("scala") + SCALA("scala", ".scala"); private final String name; private final String extension; diff --git a/src/main/resources/templates/build.gradle.kts.ftl b/src/main/resources/templates/build.gradle.kts.ftl index 33b8f4cd..a90ab308 100644 --- a/src/main/resources/templates/build.gradle.kts.ftl +++ b/src/main/resources/templates/build.gradle.kts.ftl @@ -17,6 +17,8 @@ plugins { <#else> kotlin ("jvm") version "1.7.21" +<#elseif language == "scala"> + scala <#else> java @@ -71,11 +73,18 @@ dependencies { <#if language == "kotlin" && vertxVersion?starts_with("4.")> implementation(kotlin("stdlib-jdk8")) +<#elseif language == "scala"> + implementation("org.scala-lang:scala3-library_3:3.5.2") + implementation("io.vertx:vertx-lang-scala_3:${vertxVersion}") <#if hasPgClient> implementation("com.ongres.scram:client:2.1") -<#if hasVertxJUnit5> +<#if language == "scala"> + testImplementation("io.vertx:vertx-lang-scala-test_3:${vertxVersion}") + testImplementation("org.scalatest:scalatest_3:3.2.19") + testRuntimeOnly("org.scalatestplus:junit-5-11_3:3.2.19.0") +<#elseif hasVertxJUnit5> testImplementation("io.vertx:vertx-junit5") testImplementation("org.junit.jupiter:junit-jupiter:$junitJupiterVersion") <#elseif hasVertxUnit> @@ -111,7 +120,9 @@ tasks.withType { } tasks.withType { -<#if hasVertxJUnit5> +<#if language == "scala"> + useJUnitPlatform() +<#elseif hasVertxJUnit5> useJUnitPlatform() <#elseif hasVertxUnit> useJUnit() diff --git a/src/main/resources/templates/pom.xml.ftl b/src/main/resources/templates/pom.xml.ftl index 8c6cbf90..ae365352 100644 --- a/src/main/resources/templates/pom.xml.ftl +++ b/src/main/resources/templates/pom.xml.ftl @@ -18,6 +18,9 @@ 1.7.21 +<#elseif language == "scala"> + 3.5.2 + 3.2.19 <#else> 3.8.1 @@ -89,6 +92,20 @@ + +<#elseif language == "scala"> +<#noparse> + + org.scala-lang + scala3-library_3 + ${scala.version} + + + io.vertx + vertx-lang-scala_3 + ${vertx.version} + + <#if hasPgClient> @@ -98,7 +115,22 @@ -<#if hasVertxJUnit5> +<#if language == "scala"> +<#noparse> + + io.vertx + vertx-lang-scala-test_3 + ${vertx.version} + test + + + org.scalatest + scalatest_3 + ${scalatest.version} + test + + +<#elseif hasVertxJUnit5> io.vertx vertx-junit5 @@ -141,6 +173,11 @@ ${project.basedir}/src/main/kotlin ${project.basedir}/src/test/kotlin +<#elseif language == "scala"> +<#noparse> + ${project.basedir}/src/main/scala + ${project.basedir}/src/test/scala + <#if language == "kotlin"> @@ -172,6 +209,52 @@ +<#elseif language == "scala"> + + net.alchim31.maven + scala-maven-plugin + 4.9.2 + + + -feature + -deprecation + + + + + compile + + compile + + + + test-compile + + testCompile + + + + + + org.scalatest + scalatest-maven-plugin + 2.2.0 + +<#noparse> + ${project.build.directory}/surefire-reports + + . + WDF TestSuite.txt + + + + test + + test + + + + <#else> maven-compiler-plugin @@ -220,6 +303,11 @@ <#noparse> ${maven-surefire-plugin.version} +<#if language == "scala"> + + true + + org.codehaus.mojo diff --git a/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl b/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl new file mode 100644 index 00000000..05c95f77 --- /dev/null +++ b/src/main/resources/templates/src/main/scala/MainVerticle.scala.ftl @@ -0,0 +1,29 @@ +package ${packageName} + +import io.vertx.core.{AbstractVerticle, Promise} +import io.vertx.lang.scala.ScalaVerticle +import io.vertx.lang.scala.ImplicitConversions.vertxFutureToScalaFuture + +import scala.concurrent.Future +import scala.language.implicitConversions + +class MainVerticle extends AbstractVerticle: + + override def start(startPromise: Promise[Void]): Unit = + vertx + .deployVerticle(HttpVerticle().asJava) + .onSuccess(_ => startPromise.complete) + .onFailure(e => startPromise.fail(e)) + + +class HttpVerticle extends ScalaVerticle: + + override def asyncStart: Future[Unit] = + vertx + .createHttpServer() + .requestHandler(_.response + .putHeader("content-type", "text/plain") + .end("Hello from Vert.x!")) + .listen(8888) + .onSuccess(_ => println("HTTP server started on port 8888")) + .mapEmpty[Unit]() \ No newline at end of file diff --git a/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl b/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl new file mode 100644 index 00000000..e5a56ca3 --- /dev/null +++ b/src/main/resources/templates/src/test/scala/TestMainVerticle.scala.ftl @@ -0,0 +1,24 @@ +package ${packageName} + +import io.vertx.core.http.HttpMethod + +import io.vertx.lang.scala.ImplicitConversions.vertxFutureToScalaFuture +import io.vertx.lang.scala.testing.VerticleTesting + +import org.scalatest.matchers.should.Matchers + +import scala.language.implicitConversions + + +class TestMainVerticle extends VerticleTesting[HttpVerticle], Matchers: + + "HttpVerticle" should "bind to 8888 and answer with 'Hello from Vert.x!'" in { + val httpClient = vertx.createHttpClient() + + for { + req <- httpClient.request(HttpMethod.GET, 8888, "127.0.0.1", "/") + res <- req.send() + body <- res.body.map(_.toString) + assertion = body should equal("Hello from Vert.x!") + } yield assertion + } \ No newline at end of file diff --git a/src/test/java/io/vertx/starter/service/GeneratorTest.java b/src/test/java/io/vertx/starter/service/GeneratorTest.java index d3f1a440..761c8798 100644 --- a/src/test/java/io/vertx/starter/service/GeneratorTest.java +++ b/src/test/java/io/vertx/starter/service/GeneratorTest.java @@ -292,7 +292,7 @@ private void verifyMavenFiles() { private void verifyMavenOutputFiles() throws IOException { try (Stream pathStream = Files.walk(workdir)) { - Optional testResult = pathStream.filter(p -> p.toString().endsWith("TestMainVerticle.txt")).findFirst(); + Optional testResult = pathStream.filter(p -> p.toString().endsWith("TestMainVerticle.xml")).findFirst(); assertThat(testResult).isPresent().hasValueSatisfying(p -> assertThat(p).isRegularFile()); assertThat(workdir.resolve("target/demo-1.0.0-SNAPSHOT-fat.jar")).isRegularFile(); }