From 4b241e2b1297a1668cd3fa2646c64757262c13b3 Mon Sep 17 00:00:00 2001 From: Jakub Wojnowski <29680262+jwojnowski@users.noreply.github.com> Date: Tue, 2 Apr 2024 02:15:03 +0200 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Add=20circe=20support?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 4 +- build.sbt | 16 ++++++- .../humanoid/circe/CirceInstances.scala | 45 +++++++++++++++++++ .../me/wojnowski/humanoid/circe/package.scala | 24 ++++++++++ 4 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 circe/src/main/scala/me/wojnowski/humanoid/circe/CirceInstances.scala create mode 100644 circe/src/main/scala/me/wojnowski/humanoid/circe/package.scala diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 41b21c2..5a8f082 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,11 +76,11 @@ jobs: - name: Make target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: mkdir -p uuid/target scuid/target core/target project/target + run: mkdir -p uuid/target scuid/target circe/target core/target project/target - name: Compress target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') - run: tar cf targets.tar uuid/target scuid/target core/target project/target + run: tar cf targets.tar uuid/target scuid/target circe/target core/target project/target - name: Upload target directories if: github.event_name != 'pull_request' && (startsWith(github.ref, 'refs/tags/v') || github.ref == 'refs/heads/main') diff --git a/build.sbt b/build.sbt index e7f8f14..d1e2cdb 100644 --- a/build.sbt +++ b/build.sbt @@ -1,5 +1,5 @@ // https://typelevel.org/sbt-typelevel/faq.html#what-is-a-base-version-anyway -ThisBuild / tlBaseVersion := "0.1" // your current series x.y +ThisBuild / tlBaseVersion := "0.2" // your current series x.y ThisBuild / organization := "me.wojnowski" ThisBuild / organizationName := "Jakub Wojnowski" @@ -58,4 +58,16 @@ lazy val scuid = ) ) -lazy val root = tlCrossRootProject.aggregate(core, scuid) +lazy val circe = + project + .in(file("circe")) + .dependsOn(core) + .settings( + name := "humanoid-circe", + libraryDependencies ++= Seq( + "io.circe" %% "circe-core" % "0.14.6", + "org.scalameta" %% "munit" % "0.7.29" % Test + ) + ) + +lazy val root = tlCrossRootProject.aggregate(core, scuid, circe) diff --git a/circe/src/main/scala/me/wojnowski/humanoid/circe/CirceInstances.scala b/circe/src/main/scala/me/wojnowski/humanoid/circe/CirceInstances.scala new file mode 100644 index 0000000..8c38be4 --- /dev/null +++ b/circe/src/main/scala/me/wojnowski/humanoid/circe/CirceInstances.scala @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2023 Jakub Wojnowski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package me.wojnowski.humanoid.circe + +import io.circe.Decoder +import io.circe.Encoder +import io.circe.KeyDecoder +import io.circe.KeyEncoder +import me.wojnowski.humanoid.HumanId +import me.wojnowski.humanoid.IdConverter + +trait CirceInstances { + + implicit def humanIdEncoder[P <: String, Id]: Encoder[HumanId[P, Id]] = + Encoder.encodeString.contramap(_.renderWithPrefix) + + implicit def humanIdDecoder[P <: String, Id](implicit valueOfPrefix: ValueOf[P], idable: IdConverter[Id]): Decoder[HumanId[P, Id]] = + Decoder.decodeString.emap(HumanId.parsePrefixOptional[P, Id]) + + implicit def humanIdKeyEncoder[P <: String, Id]: KeyEncoder[HumanId[P, Id]] = + KeyEncoder.instance(_.renderWithPrefix) + + implicit def humanIdKeyDecoder[P <: String, Id](implicit valueOfPrefix: ValueOf[P], idable: IdConverter[Id]): KeyDecoder[HumanId[P, Id]] = + KeyDecoder.instance(HumanId.parsePrefixOptional[P, Id](_).toOption) + +} diff --git a/circe/src/main/scala/me/wojnowski/humanoid/circe/package.scala b/circe/src/main/scala/me/wojnowski/humanoid/circe/package.scala new file mode 100644 index 0000000..e85326e --- /dev/null +++ b/circe/src/main/scala/me/wojnowski/humanoid/circe/package.scala @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 Jakub Wojnowski + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package me.wojnowski.humanoid + +package object circe extends CirceInstances