From 4f869baf4b54b3864d935430aa30118448d94b38 Mon Sep 17 00:00:00 2001 From: pkiersznowski Date: Tue, 16 Apr 2024 21:26:57 +0200 Subject: [PATCH] Replace `given` with implicits --- README.md | 9 +-------- .../pl/iterators/kebs/circe/KebsCirce.scala | 8 ++++---- .../iterators/kebs/circe/KebsEnumFormats.scala | 16 ++++++++-------- .../CirceFormatCapitalizedVariantTests.scala | 2 +- .../CirceFormatSnakifiedVariantTests.scala | 2 +- .../kebs/circe/CirceFormatTests.scala | 2 +- .../instances/TimeInstancesMixinTests.scala | 8 ++++---- .../kebs/core/macros/ValueClassReps.scala | 2 +- .../pl/iterators/kebs/doobie/Kebs.scala | 14 +++++++------- .../kebs/doobie/enums/KebsEnums.scala | 18 +++++++++--------- .../kebs/doobie/ComplexTypesTests.scala | 6 +++--- .../kebs/enumeratum/KebsEnumeratum.scala | 2 +- .../kebs/enumeratum/KebsValueEnumeratum.scala | 2 +- .../enums/KebsEnumUnmarshallers.scala | 12 ++++++------ .../pl/iterators/kebs/http4s/package.scala | 6 +++--- .../iterators/kebs/http4s/Http4sDslTests.scala | 2 +- .../pl/iterators/kebs/opaque/Opaque.scala | 2 +- .../pl/iterators/kebs/opaque/OpaqueTest.scala | 7 +++++-- .../enums/KebsEnumUnmarshallers.scala | 12 ++++++------ 19 files changed, 64 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 1c92487a..c73e2141 100644 --- a/README.md +++ b/README.md @@ -668,13 +668,6 @@ If you're using recursive types - due to [this issue](https://github.com/circe/c case class R(a: Int, rs: Seq[R]) derives Decoder, Encoder.AsObject ``` - -3. If you're using flat format or Snakified/Capitalized formats, remember to import `given` instances, e.g.: -```scala - object KebsProtocol extends KebsCirce with KebsCirce.Snakified - import KebsProtocol.{given, _} - ``` - #### - kebs generates akka-http / pekko-http Unmarshaller (kebs-akka-http / kebs-pekko-http) It makes it very easy to use 1-element case-classes or `enumeratum` enums/value enums in eg. `parameters` directive: @@ -729,7 +722,7 @@ import org.http4s.dsl.io._ import org.http4s.implicits._ import pl.iterators.kebs.opaque.Opaque -import pl.iterators.kebs.http4s.{given, _} +import pl.iterators.kebs.http4s._ import pl.iterators.kebs.instances.KebsInstances._ // optional, if you want instances support, ex. java.util.Currency opaque type Age = Int diff --git a/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsCirce.scala b/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsCirce.scala index f0377854..63f04f2f 100644 --- a/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsCirce.scala +++ b/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsCirce.scala @@ -30,17 +30,17 @@ private[circe] trait KebsAutoDerivation extends CaseClass1ToValueClass { } trait KebsCirce extends KebsAutoDerivation { - inline given[T, A](using rep: ValueClassLike[T, A], decoder: Decoder[A]): Decoder[T] = { + implicit inline def kebsDecoder[T, A](using rep: ValueClassLike[T, A], decoder: Decoder[A]): Decoder[T] = { decoder.emap(obj => Try(rep.apply(obj)).toEither.left.map(_.getMessage)) } - inline given[T, A](using rep: ValueClassLike[T, A], encoder: Encoder[A]): Encoder[T] = + implicit inline def kebsEncoder[T, A](using rep: ValueClassLike[T, A], encoder: Encoder[A]): Encoder[T] = encoder.contramap(rep.unapply) - inline given[T, A](using rep: InstanceConverter[T, A], encoder: Encoder[A]): Encoder[T] = + implicit inline def kebsEncoder[T, A](using rep: InstanceConverter[T, A], encoder: Encoder[A]): Encoder[T] = encoder.contramap(rep.encode) - inline given[T, A](using rep: InstanceConverter[T, A], decoder: Decoder[A]): Decoder[T] = + implicit inline def kebsDecoder[T, A](using rep: InstanceConverter[T, A], decoder: Decoder[A]): Decoder[T] = decoder.emap(obj => Try(rep.decode(obj)).toEither.left.map(_.getMessage)) } diff --git a/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsEnumFormats.scala b/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsEnumFormats.scala index eb0da740..11f9c809 100644 --- a/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsEnumFormats.scala +++ b/circe/src/main/scala-3/pl/iterators/kebs/circe/KebsEnumFormats.scala @@ -60,29 +60,29 @@ trait CirceValueEnum { } trait KebsEnumFormats extends CirceEnum with CirceValueEnum { - implicit inline given[E <: Enum](using ev: EnumLike[E]): Decoder[E] = enumDecoder(ev) + implicit inline def kebsEnumDecoder[E <: Enum](using ev: EnumLike[E]): Decoder[E] = enumDecoder(ev) - implicit inline given[E <: Enum](using ev: EnumLike[E]): Encoder[E] = enumEncoder(ev) + implicit inline def kebsEnumEncoder[E <: Enum](using ev: EnumLike[E]): Encoder[E] = enumEncoder(ev) - implicit inline given[V, E <: ValueEnumLikeEntry[V]](using ev: ValueEnumLike[V, E], decoder: Decoder[V]): Decoder[E] = + implicit inline def kebsValueEnumDecoder[V, E <: ValueEnumLikeEntry[V]](using ev: ValueEnumLike[V, E], decoder: Decoder[V]): Decoder[E] = valueEnumDecoder(ev) - implicit inline given[V, E <: ValueEnumLikeEntry[V]](using ev: ValueEnumLike[V, E], encoder: Encoder[V]): Encoder[E] = + implicit inline def kebsValueEnumEncoder[V, E <: ValueEnumLikeEntry[V]](using ev: ValueEnumLike[V, E], encoder: Encoder[V]): Encoder[E] = valueEnumEncoder(ev) trait Uppercase extends CirceEnum { - implicit inline given[E <: Enum](using ev: EnumLike[E]): Decoder[E] = + implicit inline def kebsUppercaseEnumDecoder[E <: Enum](using ev: EnumLike[E]): Decoder[E] = uppercaseEnumDecoder(ev) - implicit inline given[E <: Enum](using ev: EnumLike[E]): Encoder[E] = + implicit inline def kebsUppercaseEnumEncoder[E <: Enum](using ev: EnumLike[E]): Encoder[E] = uppercaseEnumEncoder(ev) } trait Lowercase extends CirceEnum { - implicit inline given[E <: Enum](using ev: EnumLike[E]): Decoder[E] = + implicit inline def kebsLowercaseEnumDecoder[E <: Enum](using ev: EnumLike[E]): Decoder[E] = lowercaseEnumDecoder(ev) - implicit inline given[E <: Enum](using ev: EnumLike[E]): Encoder[E] = + implicit inline def kebsLowercaseEnumEncoder[E <: Enum](using ev: EnumLike[E]): Encoder[E] = lowercaseEnumEncoder(ev) } } diff --git a/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatCapitalizedVariantTests.scala b/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatCapitalizedVariantTests.scala index 97da3221..13482bf2 100644 --- a/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatCapitalizedVariantTests.scala +++ b/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatCapitalizedVariantTests.scala @@ -10,7 +10,7 @@ import pl.iterators.kebs.circe.model._ class CirceFormatCapitalizedVariantTests extends AnyFunSuite with Matchers { object KebsProtocol extends KebsCirce with KebsCirce.Capitalized - import KebsProtocol.{given, _} + import KebsProtocol._ test("Flat format remains unchanged") { val decoder = implicitly[Decoder[C]] diff --git a/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatSnakifiedVariantTests.scala b/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatSnakifiedVariantTests.scala index 4b31d5ee..8c5ea62e 100644 --- a/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatSnakifiedVariantTests.scala +++ b/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatSnakifiedVariantTests.scala @@ -12,7 +12,7 @@ import io.circe.derivation.Configuration class CirceFormatSnakifiedVariantTests extends AnyFunSuite with Matchers { object KebsProtocol extends KebsCirce with KebsCirce.Snakified - import KebsProtocol.{given, _} + import KebsProtocol._ test("Flat format remains unchanged") { val decoder = implicitly[Decoder[C]] diff --git a/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatTests.scala b/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatTests.scala index e6923e12..ea54d7e1 100644 --- a/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatTests.scala +++ b/circe/src/test/scala-3/pl/iterators/kebs/circe/CirceFormatTests.scala @@ -13,7 +13,7 @@ import pl.iterators.kebs.circe.model._ class CirceFormatTests extends AnyFunSuite with Matchers { object KebsProtocol extends KebsCirce - import KebsProtocol.{given, _} + import KebsProtocol._ // https://github.com/circe/circe/issues/1980 case class R(a: Int, rs: Seq[R]) derives Decoder, Encoder.AsObject diff --git a/circe/src/test/scala-3/pl/iterators/kebs/circe/instances/TimeInstancesMixinTests.scala b/circe/src/test/scala-3/pl/iterators/kebs/circe/instances/TimeInstancesMixinTests.scala index 6b3bbf98..9487c82a 100644 --- a/circe/src/test/scala-3/pl/iterators/kebs/circe/instances/TimeInstancesMixinTests.scala +++ b/circe/src/test/scala-3/pl/iterators/kebs/circe/instances/TimeInstancesMixinTests.scala @@ -17,7 +17,7 @@ class TimeInstancesMixinTests extends AnyFunSuite with Matchers { test("Instant epoch milli format") { object TimeInstancesProtocol extends KebsCirce with InstantEpochMilliLong - import TimeInstancesProtocol.{given, _} + import TimeInstancesProtocol._ "implicitly[ValueClassLike[Instant, Long]]" shouldNot typeCheck "implicitly[ValueClassLike[Long, Instant]]" shouldNot typeCheck @@ -33,7 +33,7 @@ class TimeInstancesMixinTests extends AnyFunSuite with Matchers { test("Duration nanos format, Instant epoch milli format") { object TimeInstancesProtocol extends KebsCirce with DurationNanosLong with InstantEpochMilliLong - import TimeInstancesProtocol.{given, _} + import TimeInstancesProtocol._ "implicitly[ValueClassLike[Instant, Long]]" shouldNot typeCheck "implicitly[ValueClassLike[Long, Instant]]" shouldNot typeCheck @@ -64,7 +64,7 @@ class TimeInstancesMixinTests extends AnyFunSuite with Matchers { override implicit val localDateTimeFormatter: InstanceConverter[LocalDateTime, String] = InstanceConverter.apply[LocalDateTime, String](_.format(formatter), LocalDateTime.parse(_, formatter)) } - import TimeInstancesProtocol.{given, _} + import TimeInstancesProtocol._ "implicitly[ValueClassLike[LocalDateTime, String]]" shouldNot typeCheck "implicitly[ValueClassLike[String, LocalDateTime]]" shouldNot typeCheck @@ -98,7 +98,7 @@ class TimeInstancesMixinTests extends AnyFunSuite with Matchers { } } } - import TimeInstancesProtocol.{given, _} + import TimeInstancesProtocol._ "implicitly[ValueClassLike[LocalDateTime, String]]" shouldNot typeCheck "implicitly[ValueClassLike[String, LocalDateTime]]" shouldNot typeCheck diff --git a/core/src/main/scala-3/pl/iterators/kebs/core/macros/ValueClassReps.scala b/core/src/main/scala-3/pl/iterators/kebs/core/macros/ValueClassReps.scala index 526bfd9d..e6337fea 100644 --- a/core/src/main/scala-3/pl/iterators/kebs/core/macros/ValueClassReps.scala +++ b/core/src/main/scala-3/pl/iterators/kebs/core/macros/ValueClassReps.scala @@ -5,7 +5,7 @@ import scala.deriving.Mirror final class ValueClassLike[VC, F1](val apply: F1 => VC, val unapply: VC => F1) trait CaseClass1ToValueClass { - inline given[T <: Product, F1](using m: Mirror.ProductOf[T], teq: m.MirroredElemTypes =:= F1 *: EmptyTuple.type): ValueClassLike[T, F1] = { + implicit inline def caseClass1ToValueClassLike[T <: Product, F1](using m: Mirror.ProductOf[T], teq: m.MirroredElemTypes =:= F1 *: EmptyTuple.type): ValueClassLike[T, F1] = { new ValueClassLike[T, F1](f1 => m.fromProduct(Tuple1(f1)), _.productElement(0).asInstanceOf[F1]) } } diff --git a/doobie/src/main/scala-3/pl/iterators/kebs/doobie/Kebs.scala b/doobie/src/main/scala-3/pl/iterators/kebs/doobie/Kebs.scala index 8daab1d1..9ed7eab7 100644 --- a/doobie/src/main/scala-3/pl/iterators/kebs/doobie/Kebs.scala +++ b/doobie/src/main/scala-3/pl/iterators/kebs/doobie/Kebs.scala @@ -8,17 +8,17 @@ import pl.iterators.kebs.core.macros.ValueClassLike import scala.reflect.ClassTag trait Kebs { - inline given[A, M](using vcLike: ValueClassLike[A, M], m: Meta[M]): Meta[A] = m.imap(vcLike.apply)(vcLike.unapply) + implicit inline def meta[A, M](using vcLike: ValueClassLike[A, M], m: Meta[M]): Meta[A] = m.imap(vcLike.apply)(vcLike.unapply) - inline given[A, M](using vcLike: ValueClassLike[A, M], m: Meta[Option[M]]): Meta[Option[A]] = m.imap(_.map(vcLike.apply))(_.map(vcLike.unapply)) + implicit inline def metaOption[A, M](using vcLike: ValueClassLike[A, M], m: Meta[Option[M]]): Meta[Option[A]] = m.imap(_.map(vcLike.apply))(_.map(vcLike.unapply)) - inline given[A, M](using vcLike: ValueClassLike[A, M], m: Meta[Array[M]], cta: ClassTag[A], ctm: ClassTag[M]): Meta[Array[A]] = m.imap(_.map(vcLike.apply))(_.map(vcLike.unapply)) + implicit inline def metaArray[A, M](using vcLike: ValueClassLike[A, M], m: Meta[Array[M]], cta: ClassTag[A], ctm: ClassTag[M]): Meta[Array[A]] = m.imap(_.map(vcLike.apply))(_.map(vcLike.unapply)) - inline given[A, M](using vcLike: ValueClassLike[A, M], m: Meta[Array[Option[M]]], cta: ClassTag[Option[A]]): Meta[Array[Option[A]]] = m.imap(_.map(_.map(vcLike.apply)))(_.map(_.map(vcLike.unapply))) + implicit inline def metaArrayOption[A, M](using vcLike: ValueClassLike[A, M], m: Meta[Array[Option[M]]], cta: ClassTag[Option[A]]): Meta[Array[Option[A]]] = m.imap(_.map(_.map(vcLike.apply)))(_.map(_.map(vcLike.unapply))) - inline given[A, M](using instanceConverter: InstanceConverter[A, M], m: Meta[M]): Meta[A] = m.imap(instanceConverter.decode)(instanceConverter.encode) + implicit inline def meta[A, M](using instanceConverter: InstanceConverter[A, M], m: Meta[M]): Meta[A] = m.imap(instanceConverter.decode)(instanceConverter.encode) - inline given[A, M](using instanceConverter: InstanceConverter[A, M], m: Meta[Array[M]], cta: ClassTag[A], ctm: ClassTag[M]): Meta[Array[A]] = m.imap(_.map(instanceConverter.decode))(_.map(instanceConverter.encode)) + implicit inline def metaArray[A, M](using instanceConverter: InstanceConverter[A, M], m: Meta[Array[M]], cta: ClassTag[A], ctm: ClassTag[M]): Meta[Array[A]] = m.imap(_.map(instanceConverter.decode))(_.map(instanceConverter.encode)) - inline given[A, M](using instanceConverter: InstanceConverter[A, M], m: Meta[Array[Option[M]]], cta: ClassTag[Option[A]]): Meta[Array[Option[A]]] = m.imap(_.map(_.map(instanceConverter.decode)))(_.map(_.map(instanceConverter.encode))) + implicit inline def metaArrayOption[A, M](using instanceConverter: InstanceConverter[A, M], m: Meta[Array[Option[M]]], cta: ClassTag[Option[A]]): Meta[Array[Option[A]]] = m.imap(_.map(_.map(instanceConverter.decode)))(_.map(_.map(instanceConverter.encode))) } \ No newline at end of file diff --git a/doobie/src/main/scala-3/pl/iterators/kebs/doobie/enums/KebsEnums.scala b/doobie/src/main/scala-3/pl/iterators/kebs/doobie/enums/KebsEnums.scala index 63d31154..6e1fe644 100644 --- a/doobie/src/main/scala-3/pl/iterators/kebs/doobie/enums/KebsEnums.scala +++ b/doobie/src/main/scala-3/pl/iterators/kebs/doobie/enums/KebsEnums.scala @@ -7,19 +7,19 @@ import scala.reflect.Enum import pl.iterators.kebs.core.enums.EnumLike trait KebsEnums { - inline given enumMeta[E](using e: EnumLike[E]): Meta[E] = Meta.StringMeta.imap(e.valueOf)(_.toString) - inline given enumArrayMeta[E](using e: EnumLike[E], m: Meta[Array[String]], ct: ClassTag[E]): Meta[Array[E]] = m.imap(_.map(e.valueOf))(_.map(_.toString)) - inline given enumOptionArrayMeta[E](using e: EnumLike[E], m: Meta[Array[Option[String]]], ct: ClassTag[Option[E]]): Meta[Array[Option[E]]] = m.imap(_.map(_.map(e.valueOf)))(_.map(_.map(_.toString))) + implicit inline def enumMeta[E](using e: EnumLike[E]): Meta[E] = Meta.StringMeta.imap(e.valueOf)(_.toString) + implicit inline def enumArrayMeta[E](using e: EnumLike[E], m: Meta[Array[String]], ct: ClassTag[E]): Meta[Array[E]] = m.imap(_.map(e.valueOf))(_.map(_.toString)) + implicit inline def enumOptionArrayMeta[E](using e: EnumLike[E], m: Meta[Array[Option[String]]], ct: ClassTag[Option[E]]): Meta[Array[Option[E]]] = m.imap(_.map(_.map(e.valueOf)))(_.map(_.map(_.toString))) trait Uppercase { - inline given enumUppercaseMeta[E](using e: EnumLike[E]): Meta[E] = Meta.StringMeta.imap(s => e.values.find(_.toString.toUpperCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))(_.toString.toUpperCase) - inline given enumUppercaseArrayMeta[E](using e: EnumLike[E], m: Meta[Array[String]], ct: ClassTag[E]): Meta[Array[E]] = m.imap(_.map(s => e.values.find(_.toString.toUpperCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s"))))(_.map(_.toString.toUpperCase)) - inline given enumUppercaseOptionArrayMeta[E](using e: EnumLike[E], m: Meta[Array[Option[String]]], ct: ClassTag[Option[E]]): Meta[Array[Option[E]]] = m.imap(_.map(_.map(s => e.values.find(_.toString.toUpperCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))))(_.map(_.map(_.toString.toUpperCase))) + implicit inline def enumUppercaseMeta[E](using e: EnumLike[E]): Meta[E] = Meta.StringMeta.imap(s => e.values.find(_.toString.toUpperCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))(_.toString.toUpperCase) + implicit inline def enumUppercaseArrayMeta[E](using e: EnumLike[E], m: Meta[Array[String]], ct: ClassTag[E]): Meta[Array[E]] = m.imap(_.map(s => e.values.find(_.toString.toUpperCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s"))))(_.map(_.toString.toUpperCase)) + implicit inline def enumUppercaseOptionArrayMeta[E](using e: EnumLike[E], m: Meta[Array[Option[String]]], ct: ClassTag[Option[E]]): Meta[Array[Option[E]]] = m.imap(_.map(_.map(s => e.values.find(_.toString.toUpperCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))))(_.map(_.map(_.toString.toUpperCase))) } trait Lowercase { - inline given enumLowercaseMeta[E](using e: EnumLike[E]): Meta[E] = Meta.StringMeta.imap(s => e.values.find(_.toString.toLowerCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))(_.toString.toLowerCase) - inline given enumLowercaseMeta[E](using e: EnumLike[E], m: Meta[Array[String]], ct: ClassTag[E]): Meta[Array[E]] = m.imap(_.map(s => e.values.find(_.toString.toLowerCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s"))))(_.map(_.toString.toLowerCase)) - inline given enumLowercaseOptionArrayMeta[E](using e: EnumLike[E], m: Meta[Array[Option[String]]], ct: ClassTag[Option[E]]): Meta[Array[Option[E]]] = m.imap(_.map(_.map(s => e.values.find(_.toString.toLowerCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))))(_.map(_.map(_.toString.toLowerCase))) + implicit inline def enumLowercaseMeta[E](using e: EnumLike[E]): Meta[E] = Meta.StringMeta.imap(s => e.values.find(_.toString.toLowerCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))(_.toString.toLowerCase) + implicit inline def enumLowercaseMeta[E](using e: EnumLike[E], m: Meta[Array[String]], ct: ClassTag[E]): Meta[Array[E]] = m.imap(_.map(s => e.values.find(_.toString.toLowerCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s"))))(_.map(_.toString.toLowerCase)) + implicit inline def enumLowercaseOptionArrayMeta[E](using e: EnumLike[E], m: Meta[Array[Option[String]]], ct: ClassTag[Option[E]]): Meta[Array[Option[E]]] = m.imap(_.map(_.map(s => e.values.find(_.toString.toLowerCase == s).getOrElse(throw new IllegalArgumentException(s"enum case not found: $s")))))(_.map(_.map(_.toString.toLowerCase))) } } \ No newline at end of file diff --git a/doobie/src/test/scala-3/pl/iterators/kebs/doobie/ComplexTypesTests.scala b/doobie/src/test/scala-3/pl/iterators/kebs/doobie/ComplexTypesTests.scala index 1c99fc9d..41e694d6 100644 --- a/doobie/src/test/scala-3/pl/iterators/kebs/doobie/ComplexTypesTests.scala +++ b/doobie/src/test/scala-3/pl/iterators/kebs/doobie/ComplexTypesTests.scala @@ -8,9 +8,9 @@ import org.scalatest.funsuite.AnyFunSuite import org.scalatest.matchers.should.Matchers import pl.iterators.kebs.doobie.model._ import pl.iterators.kebs.enums.KebsEnum -import pl.iterators.kebs.doobie.given -import pl.iterators.kebs.doobie.enums.given -import pl.iterators.kebs.instances.KebsInstances.given +import pl.iterators.kebs.doobie._ +import pl.iterators.kebs.doobie.enums._ +import pl.iterators.kebs.instances.KebsInstances._ import pl.iterators.kebs.opaque.Opaque import java.util.Currency diff --git a/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsEnumeratum.scala b/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsEnumeratum.scala index 06e5e863..d503a741 100644 --- a/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsEnumeratum.scala +++ b/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsEnumeratum.scala @@ -10,7 +10,7 @@ import scala.reflect.{ClassTag, Enum} import pl.iterators.kebs.core.enums.EnumLike trait KebsEnumeratum { - inline given [E <: EnumEntry](using m: Mirror.SumOf[E], ct: ClassTag[E]): EnumLike[E] = { + implicit inline def enumLike[E <: EnumEntry](using m: Mirror.SumOf[E], ct: ClassTag[E]): EnumLike[E] = { val enumValues = summonCases[m.MirroredElemTypes, E] new EnumLike[E] { override def values: immutable.Seq[E] = enumValues.toSeq diff --git a/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsValueEnumeratum.scala b/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsValueEnumeratum.scala index b33d02ab..21b82831 100644 --- a/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsValueEnumeratum.scala +++ b/enumeratum/src/main/scala-3/pl/iterators/kebs/enumeratum/KebsValueEnumeratum.scala @@ -10,7 +10,7 @@ import scala.reflect.{ClassTag, Enum} import pl.iterators.kebs.core.enums.{ValueEnumLike, ValueEnumLikeEntry} trait KebsValueEnumeratum { - inline given [V, E <: ValueEnumEntry[V] with ValueEnumLikeEntry[V]](using m: Mirror.SumOf[E], ct: ClassTag[E]): ValueEnumLike[V, E] = { + inline implicit def valueEnumLike[V, E <: ValueEnumEntry[V] with ValueEnumLikeEntry[V]](using m: Mirror.SumOf[E], ct: ClassTag[E]): ValueEnumLike[V, E] = { val enumValues = summonValueCases[m.MirroredElemTypes, V, E] new ValueEnumLike[V, E] { override def values: immutable.Seq[E] = enumValues diff --git a/http4s-stir/src/main/scala-3/pl/iterators/kebs/http4sstir/unmarshallers/enums/KebsEnumUnmarshallers.scala b/http4s-stir/src/main/scala-3/pl/iterators/kebs/http4sstir/unmarshallers/enums/KebsEnumUnmarshallers.scala index 8ec85f67..204839ba 100644 --- a/http4s-stir/src/main/scala-3/pl/iterators/kebs/http4sstir/unmarshallers/enums/KebsEnumUnmarshallers.scala +++ b/http4s-stir/src/main/scala-3/pl/iterators/kebs/http4sstir/unmarshallers/enums/KebsEnumUnmarshallers.scala @@ -18,7 +18,7 @@ trait EnumUnmarshallers { } } - given kebsEnumUnmarshaller[E <: Enum](using e: EnumLike[E]): FromStringUnmarshaller[E] = + implicit def kebsEnumUnmarshaller[E <: Enum](using e: EnumLike[E]): FromStringUnmarshaller[E] = enumUnmarshaller } @@ -39,19 +39,19 @@ trait ValueEnumUnmarshallers extends EnumUnmarshallers { } } - given kebsValueEnumUnmarshaller[V, E <: ValueEnumLikeEntry[V]](using `enum`: ValueEnumLike[V, E], cls: ClassTag[V]): Unmarshaller[V, E] = + implicit def kebsValueEnumUnmarshaller[V, E <: ValueEnumLikeEntry[V]](using `enum`: ValueEnumLike[V, E], cls: ClassTag[V]): Unmarshaller[V, E] = valueEnumUnmarshaller - given kebsIntValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Int]](using ev: ValueEnumLike[Int, E]): FromStringUnmarshaller[E] = + implicit def kebsIntValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Int]](using ev: ValueEnumLike[Int, E]): FromStringUnmarshaller[E] = intFromStringUnmarshaller andThen valueEnumUnmarshaller - given kebsLongValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Long]](using ev: ValueEnumLike[Long, E]): FromStringUnmarshaller[E] = + implicit def kebsLongValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Long]](using ev: ValueEnumLike[Long, E]): FromStringUnmarshaller[E] = longFromStringUnmarshaller andThen valueEnumUnmarshaller - given kebsShortValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Short]](using ev: ValueEnumLike[Short, E]): FromStringUnmarshaller[E] = + implicit def kebsShortValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Short]](using ev: ValueEnumLike[Short, E]): FromStringUnmarshaller[E] = shortFromStringUnmarshaller andThen valueEnumUnmarshaller - given kebsByteValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Byte]](using ev: ValueEnumLike[Byte, E]): FromStringUnmarshaller[E] = + implicit def kebsByteValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Byte]](using ev: ValueEnumLike[Byte, E]): FromStringUnmarshaller[E] = byteFromStringUnmarshaller andThen valueEnumUnmarshaller } diff --git a/http4s/src/main/scala-3/pl/iterators/kebs/http4s/package.scala b/http4s/src/main/scala-3/pl/iterators/kebs/http4s/package.scala index 528671c0..15368a74 100644 --- a/http4s/src/main/scala-3/pl/iterators/kebs/http4s/package.scala +++ b/http4s/src/main/scala-3/pl/iterators/kebs/http4s/package.scala @@ -52,6 +52,6 @@ object InstanceUUID { def apply[T](using rep: InstanceConverter[T, UUID]) = new PathVar[T](str => Try(rep.decode(UUID.fromString(str)))) } -given[T, U](using rep: ValueClassLike[T, U], qpd: QueryParamDecoder[U]): QueryParamDecoder[T] = qpd.emap(u => Try(rep.apply(u)).toEither.left.map(t => ParseFailure(t.getMessage, t.getMessage))) -given[T, U](using rep: InstanceConverter[T, U], qpd: QueryParamDecoder[U]): QueryParamDecoder[T] = qpd.emap(u => Try(rep.decode(u)).toEither.left.map(t => ParseFailure(t.getMessage, t.getMessage))) -given[E <: Enum](using e: EnumLike[E]): QueryParamDecoder[E] = QueryParamDecoder[String].emap(str => Try(e.values.find(_.toString.toUpperCase == str.toUpperCase).getOrElse(throw new IllegalArgumentException(s"enum case not found: $str"))).toEither.left.map(t => ParseFailure(t.getMessage, t.getMessage))) +implicit def valueClassQueryParamDecoder[T, U](using rep: ValueClassLike[T, U], qpd: QueryParamDecoder[U]): QueryParamDecoder[T] = qpd.emap(u => Try(rep.apply(u)).toEither.left.map(t => ParseFailure(t.getMessage, t.getMessage))) +implicit def instanceConverterQueryParamDecoder[T, U](using rep: InstanceConverter[T, U], qpd: QueryParamDecoder[U]): QueryParamDecoder[T] = qpd.emap(u => Try(rep.decode(u)).toEither.left.map(t => ParseFailure(t.getMessage, t.getMessage))) +implicit def enumQueryParamDecoder[E <: Enum](using e: EnumLike[E]): QueryParamDecoder[E] = QueryParamDecoder[String].emap(str => Try(e.values.find(_.toString.toUpperCase == str.toUpperCase).getOrElse(throw new IllegalArgumentException(s"enum case not found: $str"))).toEither.left.map(t => ParseFailure(t.getMessage, t.getMessage))) diff --git a/http4s/src/test/scala-3/pl/iterators/kebs/http4s/Http4sDslTests.scala b/http4s/src/test/scala-3/pl/iterators/kebs/http4s/Http4sDslTests.scala index 7ef85a75..bcf87950 100644 --- a/http4s/src/test/scala-3/pl/iterators/kebs/http4s/Http4sDslTests.scala +++ b/http4s/src/test/scala-3/pl/iterators/kebs/http4s/Http4sDslTests.scala @@ -11,7 +11,7 @@ import java.time.Year import java.util.Currency import pl.iterators.kebs.instances.KebsInstances._ -import pl.iterators.kebs.http4s.{given, _} +import pl.iterators.kebs.http4s._ import pl.iterators.kebs.core.macros.CaseClass1ToValueClass import pl.iterators.kebs.enums.KebsEnum diff --git a/opaque/src/main/scala-3/pl/iterators/kebs/opaque/Opaque.scala b/opaque/src/main/scala-3/pl/iterators/kebs/opaque/Opaque.scala index 9aa33080..e9925387 100644 --- a/opaque/src/main/scala-3/pl/iterators/kebs/opaque/Opaque.scala +++ b/opaque/src/main/scala-3/pl/iterators/kebs/opaque/Opaque.scala @@ -40,5 +40,5 @@ trait Opaque[OpaqueType, Unwrapped](using ev: OpaqueType =:= Unwrapped) { def unwrap: Unwrapped = ev.apply(w) } - given vcLike: ValueClassLike[OpaqueType, Unwrapped] = ValueClassLike(apply, _.unwrap) + implicit val vcLike: ValueClassLike[OpaqueType, Unwrapped] = ValueClassLike(apply, _.unwrap) } \ No newline at end of file diff --git a/opaque/src/test/scala-3/pl/iterators/kebs/opaque/OpaqueTest.scala b/opaque/src/test/scala-3/pl/iterators/kebs/opaque/OpaqueTest.scala index 25c55ba4..c9fbe582 100644 --- a/opaque/src/test/scala-3/pl/iterators/kebs/opaque/OpaqueTest.scala +++ b/opaque/src/test/scala-3/pl/iterators/kebs/opaque/OpaqueTest.scala @@ -23,8 +23,11 @@ object OpaqueTestTypeclass { def show(a: A): String } - given Showable[Int] = (a: Int) => a.toString - given[S, A](using showable: Showable[S], vcLike: ValueClassLike[A, S]): Showable[A] = (a: A) => showable.show(vcLike.unapply(a)) + implicit val intShowable: Showable[Int] = new Showable[Int] { + override def show(a: Int): String = a.toString + } + + implicit def show[S, A](using showable: Showable[S], vcLike: ValueClassLike[A, S]): Showable[A] = (a: A) => showable.show(vcLike.unapply(a)) } class OpaqueTest extends AnyFunSuite with Matchers { diff --git a/pekko-http/src/main/scala-3/pl/iterators/kebs/pekkohttp/unmarshallers/enums/KebsEnumUnmarshallers.scala b/pekko-http/src/main/scala-3/pl/iterators/kebs/pekkohttp/unmarshallers/enums/KebsEnumUnmarshallers.scala index c0607414..0bd8b53c 100644 --- a/pekko-http/src/main/scala-3/pl/iterators/kebs/pekkohttp/unmarshallers/enums/KebsEnumUnmarshallers.scala +++ b/pekko-http/src/main/scala-3/pl/iterators/kebs/pekkohttp/unmarshallers/enums/KebsEnumUnmarshallers.scala @@ -19,7 +19,7 @@ trait EnumUnmarshallers { } } - given kebsEnumUnmarshaller[E](using e: EnumLike[E]): FromStringUnmarshaller[E] = + implicit def kebsEnumUnmarshaller[E](using e: EnumLike[E]): FromStringUnmarshaller[E] = enumUnmarshaller } @@ -40,19 +40,19 @@ trait ValueEnumUnmarshallers extends EnumUnmarshallers { } } - given kebsValueEnumUnmarshaller[V, E <: ValueEnumLikeEntry[V]](using `enum`: ValueEnumLike[V, E], cls: ClassTag[V]): Unmarshaller[V, E] = + implicit def kebsValueEnumUnmarshaller[V, E <: ValueEnumLikeEntry[V]](using `enum`: ValueEnumLike[V, E], cls: ClassTag[V]): Unmarshaller[V, E] = valueEnumUnmarshaller - given kebsIntValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Int]](using ev: ValueEnumLike[Int, E]): FromStringUnmarshaller[E] = + implicit def kebsIntValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Int]](using ev: ValueEnumLike[Int, E]): FromStringUnmarshaller[E] = intFromStringUnmarshaller andThen valueEnumUnmarshaller - given kebsLongValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Long]](using ev: ValueEnumLike[Long, E]): FromStringUnmarshaller[E] = + implicit def kebsLongValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Long]](using ev: ValueEnumLike[Long, E]): FromStringUnmarshaller[E] = longFromStringUnmarshaller andThen valueEnumUnmarshaller - given kebsShortValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Short]](using ev: ValueEnumLike[Short, E]): FromStringUnmarshaller[E] = + implicit def kebsShortValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Short]](using ev: ValueEnumLike[Short, E]): FromStringUnmarshaller[E] = shortFromStringUnmarshaller andThen valueEnumUnmarshaller - given kebsByteValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Byte]](using ev: ValueEnumLike[Byte, E]): FromStringUnmarshaller[E] = + implicit def kebsByteValueEnumFromStringUnmarshaller[E <: ValueEnumLikeEntry[Byte]](using ev: ValueEnumLike[Byte, E]): FromStringUnmarshaller[E] = byteFromStringUnmarshaller andThen valueEnumUnmarshaller }