From 1142c7a86bd63fdc2ca451c9f5082842e46c28be Mon Sep 17 00:00:00 2001 From: Filippo De Luca Date: Mon, 30 Dec 2024 19:10:02 +0100 Subject: [PATCH] Fix scalajs --- .scalafmt.conf | 5 +- build.sbt | 23 ++++++++- .../src/main/scala/EncodingBench.scala | 35 ++++++++++--- modules/benchmark/src/main/scala/model.scala | 1 - .../js/src/main/scala/internal/decoding.scala | 33 ++++++++---- .../js/src/main/scala/internal/encoding.scala | 51 ++++++++++--------- .../src/main/scala/internal/encoding.scala | 1 - .../core/shared/src/main/scala/Schema.scala | 2 +- .../shared/src/test/scala/SchemaSuite.scala | 2 +- 9 files changed, 105 insertions(+), 48 deletions(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index f3ca6a5..9b7a7aa 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,11 +1,12 @@ version = "3.5.8" align.preset = none runner.dialect = scala213 + fileOverride { - "glob:**/src/*/scala-3" { + "glob:**/src/**/scala-3/**" { runner.dialect = scala3 } - "glob:**/src/*/scala-2.12" { + "glob:**/src/**/scala-2.12" { runner.dialect = scala212 } } \ No newline at end of file diff --git a/build.sbt b/build.sbt index a009fe9..7145d37 100644 --- a/build.sbt +++ b/build.sbt @@ -22,7 +22,7 @@ val scala33 = "3.3.4" val scala36 = "3.6.2" ThisBuild / spiewakMainBranches := Seq("main") -ThisBuild / crossScalaVersions := Seq(scala36, scala33, Scala213) +ThisBuild / crossScalaVersions := Seq(Scala213, scala36, scala33) ThisBuild / versionIntroduced := Map("3.0.0" -> "0.3.0") ThisBuild / scalaVersion := (ThisBuild / crossScalaVersions).value.head ThisBuild / initialCommands := """ @@ -34,6 +34,13 @@ lazy val root = project .in(file(".")) .enablePlugins(NoPublishPlugin, SonatypeCiReleasePlugin) .aggregate(core.js, core.jvm, benchmark) + .settings( + libraryDependencies --= List( + compilerPlugin( + "org.typelevel" % "kind-projector" % "0.13.2" cross CrossVersion.full + ) + ) + ) lazy val core = crossProject(JSPlatform, JVMPlatform) .crossType(CrossType.Full) @@ -112,6 +119,13 @@ lazy val jsdocs = project libraryDependencies += "org.scala-js" %%% "scalajs-dom" % "2.3.0" ) .enablePlugins(ScalaJSPlugin) + .settings( + libraryDependencies --= List( + compilerPlugin( + "org.typelevel" % "kind-projector" % "0.13.2" cross CrossVersion.full + ) + ) + ) lazy val docs = project .in(file("mdoc")) @@ -130,6 +144,13 @@ lazy val docs = project ) .dependsOn(core.jvm) .enablePlugins(MdocPlugin, NoPublishPlugin) + .settings( + libraryDependencies --= List( + compilerPlugin( + "org.typelevel" % "kind-projector" % "0.13.2" cross CrossVersion.full + ) + ) + ) ThisBuild / githubWorkflowJavaVersions := Seq(JavaSpec.temurin("11")) diff --git a/modules/benchmark/src/main/scala/EncodingBench.scala b/modules/benchmark/src/main/scala/EncodingBench.scala index beb740f..5bba489 100644 --- a/modules/benchmark/src/main/scala/EncodingBench.scala +++ b/modules/benchmark/src/main/scala/EncodingBench.scala @@ -44,16 +44,39 @@ class EncodingBench { @Benchmark @BenchmarkMode(Array(Mode.Throughput)) - def encodeRawAnMAsAv = - val map = new java.util.IdentityHashMap[String, software.amazon.awssdk.services.dynamodb.model.AttributeValue](3) - map.put("name", software.amazon.awssdk.services.dynamodb.model.AttributeValue.builder().s(allosaurus.name).build()) - map.put("age", software.amazon.awssdk.services.dynamodb.model.AttributeValue.builder().n(allosaurus.age.toString).build()) - map.put("attacks", software.amazon.awssdk.services.dynamodb.model.AttributeValue.builder().n(allosaurus.attacks.toString).build()) - DynamoValue(software.amazon.awssdk.services.dynamodb.model.AttributeValue + def encodeRawAnMAsAv = { + val map = new java.util.IdentityHashMap[ + String, + software.amazon.awssdk.services.dynamodb.model.AttributeValue + ](3) + map.put( + "name", + software.amazon.awssdk.services.dynamodb.model.AttributeValue + .builder() + .s(allosaurus.name) + .build() + ) + map.put( + "age", + software.amazon.awssdk.services.dynamodb.model.AttributeValue + .builder() + .n(allosaurus.age.toString) + .build() + ) + map.put( + "attacks", + software.amazon.awssdk.services.dynamodb.model.AttributeValue + .builder() + .n(allosaurus.attacks.toString) + .build() + ) + DynamoValue( + software.amazon.awssdk.services.dynamodb.model.AttributeValue .builder() .m(map) .build() ) + } @Benchmark @BenchmarkMode(Array(Mode.Throughput)) diff --git a/modules/benchmark/src/main/scala/model.scala b/modules/benchmark/src/main/scala/model.scala index 559d801..16944a8 100644 --- a/modules/benchmark/src/main/scala/model.scala +++ b/modules/benchmark/src/main/scala/model.scala @@ -21,4 +21,3 @@ case class Parasaurolophus(name: String, age: Int, songs: Int) extends Dynosaur case class TyrannosaurusRex(name: String, age: Int, victims: Int) extends Dynosaur case class Allosaurus(name: String, age: Int, attacks: Int) extends Dynosaur - diff --git a/modules/core/js/src/main/scala/internal/decoding.scala b/modules/core/js/src/main/scala/internal/decoding.scala index c168677..bcefad6 100644 --- a/modules/core/js/src/main/scala/internal/decoding.scala +++ b/modules/core/js/src/main/scala/internal/decoding.scala @@ -177,17 +177,30 @@ object decoding { var error: ReadError = null while (i < record.fields.length && error == null) { - val field = record.fields(i) - map.get(field.name) match { - case None => - error = ReadError( - s"required field ${field.name} does not contain a value" - ) - case Some(value) => - field.schema.read(value) match { - case Left(err) => error = err - case Right(v) => decodedValues(i) = v + record.fields(i) match { + case Field.Optional(name, schema, get) => + map.get(name) match { + case None => decodedValues(i) = None + case Some(value) => + schema.read(value) match { + case Left(err) => error = err + case Right(v) => decodedValues(i) = Some(v) + } } + + case Field.Required(name, schema, get) => + map.get(name) match { + case None => + error = ReadError( + s"required field $name does not contain a value" + ) + case Some(value) => + schema.read(value) match { + case Left(err) => error = err + case Right(v) => decodedValues(i) = v + } + } + } i += 1 } diff --git a/modules/core/js/src/main/scala/internal/encoding.scala b/modules/core/js/src/main/scala/internal/encoding.scala index 66aed15..4ae58d0 100644 --- a/modules/core/js/src/main/scala/internal/encoding.scala +++ b/modules/core/js/src/main/scala/internal/encoding.scala @@ -100,34 +100,35 @@ object encoding { def encodeRecord[R]( record: Record[R] - ): R => Either[WriteError, DynamoValue] = { - val fieldCount = record.fields.length - val fieldNames = record.fieldNames - - val writers = - record.fields.map(field => (field.get, field.schema.write(_))).toArray - - { value => - { - val dict = scalajs.js.Dictionary[AttributeValue]() - var i = 0 - var error: WriteError = null - - while (i < record.fields.length && error == null) { - val field = record.fields(i) - val fieldValue = field.get(value) - field.schema.write(fieldValue.asInstanceOf[field.A]) match { + ): R => Either[WriteError, DynamoValue] = { value => + var i = 0 + var error: WriteError = null + + val dict = scalajs.js.Dictionary[AttributeValue]() + + while (i < record.fields.length && error == null) { + record.fields(i) match { + case Field.Required(name, schema, get) => + schema.write(get(value)) match { case Left(err) => error = err - case Right(v) => dict.addOne(fieldNames(i), v.value) + case Right(v) => dict.addOne(name, v.value) + } + case Field.Optional(name, schema, get) => + val fieldValue = get(value) + if (fieldValue != None) { + schema.write(fieldValue.get) match { + case Left(err) => error = err + case Right(v) => dict.addOne(name, v.value) + } } - i += 1 - } - - if (error != null) Left(error) - else { - DynamoValue(AttributeValue.M(dict)).asRight[WriteError] - } } + + i += 1 } + + if (error != null) + Left(error) + else + DynamoValue(AttributeValue.M(dict)).asRight[WriteError] } } diff --git a/modules/core/jvm/src/main/scala/internal/encoding.scala b/modules/core/jvm/src/main/scala/internal/encoding.scala index ec570e2..45fe959 100644 --- a/modules/core/jvm/src/main/scala/internal/encoding.scala +++ b/modules/core/jvm/src/main/scala/internal/encoding.scala @@ -102,7 +102,6 @@ object encoding { record: Record[R] ): R => Either[WriteError, DynamoValue] = { val fieldCount = record.fields.length - val fieldNames = record.fieldNames { value => { diff --git a/modules/core/shared/src/main/scala/Schema.scala b/modules/core/shared/src/main/scala/Schema.scala index d07d8f0..35f8d42 100644 --- a/modules/core/shared/src/main/scala/Schema.scala +++ b/modules/core/shared/src/main/scala/Schema.scala @@ -218,7 +218,7 @@ object Schema { ) case f @ Field.Optional(name, schema, get) => OptimizedRecord( - List(f), + List(f.asInstanceOf[Field[R, _]]), values => values.head.asInstanceOf[X] ) } diff --git a/modules/core/shared/src/test/scala/SchemaSuite.scala b/modules/core/shared/src/test/scala/SchemaSuite.scala index 310febe..4286a72 100644 --- a/modules/core/shared/src/test/scala/SchemaSuite.scala +++ b/modules/core/shared/src/test/scala/SchemaSuite.scala @@ -631,7 +631,7 @@ class SchemaSuite extends ScalaCheckSuite { check(schema, departments, expected) } - test("recursive products with very wide record".only) { + test("recursive products with very wide record") { val departments = deepDepartment(1, 100) val expected = deepDepartmentDynamoValue(1, 100);