diff --git a/integrations/cats-xml/src/main/scala/com/geirolz/secret/catsxml/hashed/implicits.scala b/integrations/cats-xml/src/main/scala/com/geirolz/secret/catsxml/hashed/implicits.scala new file mode 100644 index 0000000..7dfe5d8 --- /dev/null +++ b/integrations/cats-xml/src/main/scala/com/geirolz/secret/catsxml/hashed/implicits.scala @@ -0,0 +1,12 @@ +package com.geirolz.secret.catsxml.hashed + +import cats.xml.codec.Encoder +import com.geirolz.secret.internal.SecretApi +import com.geirolz.secret.strategy.SecretStrategy +import com.geirolz.secret.{OneShotSecret, Secret} + +export com.geirolz.secret.catsxml.given_Decoder_Secret +export com.geirolz.secret.catsxml.given_Decoder_OneShotSecret + +given [S[X] <: SecretApi[X], T]: Encoder[S[T]] = + Encoder.encodeString.contramap(_.hashed) diff --git a/integrations/cats-xml/src/main/scala/com/geirolz/secret/catsxml/implicits.scala b/integrations/cats-xml/src/main/scala/com/geirolz/secret/catsxml/implicits.scala index 06d2c02..8e7fda9 100644 --- a/integrations/cats-xml/src/main/scala/com/geirolz/secret/catsxml/implicits.scala +++ b/integrations/cats-xml/src/main/scala/com/geirolz/secret/catsxml/implicits.scala @@ -1,6 +1,7 @@ package com.geirolz.secret.catsxml -import cats.xml.codec.Decoder +import cats.xml.codec.{Decoder, Encoder} +import com.geirolz.secret.internal.SecretApi import com.geirolz.secret.{OneShotSecret, Secret} import com.geirolz.secret.strategy.SecretStrategy @@ -9,3 +10,6 @@ given [T: Decoder: SecretStrategy]: Decoder[Secret[T]] = given [T: Decoder: SecretStrategy]: Decoder[OneShotSecret[T]] = Decoder[T].map(OneShotSecret[T](_)) + +given [S[X] <: SecretApi[X], T]: Encoder[S[T]] = + Encoder.encodeString.contramap(_.toString) diff --git a/integrations/cats-xml/src/test/scala/com/geirolz/secret/catsxml/SecretCatsXmlSuite.scala b/integrations/cats-xml/src/test/scala/com/geirolz/secret/catsxml/SecretCatsXmlSuite.scala index 4a654d9..3f6b4bd 100644 --- a/integrations/cats-xml/src/test/scala/com/geirolz/secret/catsxml/SecretCatsXmlSuite.scala +++ b/integrations/cats-xml/src/test/scala/com/geirolz/secret/catsxml/SecretCatsXmlSuite.scala @@ -2,7 +2,8 @@ package com.geirolz.secret.catsxml import cats.xml.codec.Decoder.Result import cats.xml.{Xml, XmlData} -import com.geirolz.secret.{OneShotSecret, Secret} +import cats.xml.syntax.* +import com.geirolz.secret.{secretTag, OneShotSecret, Secret} class SecretCatsXmlSuite extends munit.FunSuite: @@ -19,3 +20,17 @@ class SecretCatsXmlSuite extends munit.FunSuite: result.toOption.get.euseAndDestroy(v => assert(v == "secret_value")) } + + test("Secret should be encoded to json") { + val secret: Secret[String] = Secret("secret_value") + val result: Xml = secret.toXml + + assert(result == Xml.string(secretTag)) + } + + test("OneShotSecret should be encoded to json") { + val secret: OneShotSecret[String] = OneShotSecret("secret_value") + val result: Xml = secret.toXml + + assert(result == Xml.string(secretTag)) + } diff --git a/integrations/cats-xml/src/test/scala/com/geirolz/secret/catsxml/hashed/SecretCatsXmlHashedSuite.scala b/integrations/cats-xml/src/test/scala/com/geirolz/secret/catsxml/hashed/SecretCatsXmlHashedSuite.scala new file mode 100644 index 0000000..2cd2cb4 --- /dev/null +++ b/integrations/cats-xml/src/test/scala/com/geirolz/secret/catsxml/hashed/SecretCatsXmlHashedSuite.scala @@ -0,0 +1,36 @@ +package com.geirolz.secret.catsxml.hashed + +import cats.xml.codec.Decoder.Result +import cats.xml.syntax.* +import cats.xml.{Xml, XmlData} +import com.geirolz.secret.{secretTag, OneShotSecret, Secret} + +class SecretCatsXmlHashedSuite extends munit.FunSuite: + + test("Secret should be decoded from xml") { + val xml: XmlData.XmlString = Xml.string("secret_value") + val result: Result[Secret[String]] = xml.as[Secret[String]] + + result.toOption.get.euseAndDestroy(v => assert(v == "secret_value")) + } + + test("OneShotSecret should be decoded from xml") { + val xml: XmlData.XmlString = Xml.string("secret_value") + val result = xml.as[OneShotSecret[String]] + + result.toOption.get.euseAndDestroy(v => assert(v == "secret_value")) + } + + test("Secret should be encoded to json") { + val secret: Secret[String] = Secret("secret_value") + val result: Xml = secret.toXml + + assert(result == Xml.string(secret.hashed)) + } + + test("OneShotSecret should be encoded to json") { + val secret: OneShotSecret[String] = OneShotSecret("secret_value") + val result: Xml = secret.toXml + + assert(result == Xml.string(secret.hashed)) + } diff --git a/integrations/circe/src/main/scala/com/geirolz/secret/circe/hashed/implicits.scala b/integrations/circe/src/main/scala/com/geirolz/secret/circe/hashed/implicits.scala new file mode 100644 index 0000000..d2a4659 --- /dev/null +++ b/integrations/circe/src/main/scala/com/geirolz/secret/circe/hashed/implicits.scala @@ -0,0 +1,12 @@ +package com.geirolz.secret.circe.hashed + +import com.geirolz.secret.internal.SecretApi +import com.geirolz.secret.strategy.SecretStrategy +import com.geirolz.secret.{OneShotSecret, Secret} +import io.circe.{Decoder, Encoder} + +export com.geirolz.secret.circe.given_Decoder_Secret +export com.geirolz.secret.circe.given_Decoder_OneShotSecret + +given [S[X] <: SecretApi[X], T]: Encoder[S[T]] = + Encoder.encodeString.contramap(_.hashed) diff --git a/integrations/circe/src/main/scala/com/geirolz/secret/circe/implicits.scala b/integrations/circe/src/main/scala/com/geirolz/secret/circe/implicits.scala index 5ad52c8..93fdfe3 100644 --- a/integrations/circe/src/main/scala/com/geirolz/secret/circe/implicits.scala +++ b/integrations/circe/src/main/scala/com/geirolz/secret/circe/implicits.scala @@ -1,11 +1,15 @@ package com.geirolz.secret.circe +import com.geirolz.secret.internal.SecretApi import com.geirolz.secret.{OneShotSecret, Secret} import com.geirolz.secret.strategy.SecretStrategy -import io.circe.Decoder +import io.circe.{Decoder, Encoder} given [T: Decoder: SecretStrategy]: Decoder[Secret[T]] = Decoder[T].map(Secret[T](_)) given [T: Decoder: SecretStrategy]: Decoder[OneShotSecret[T]] = Decoder[T].map(OneShotSecret[T](_)) + +given [S[X] <: SecretApi[X], T]: Encoder[S[T]] = + Encoder.encodeString.contramap(_.toString) diff --git a/integrations/circe/src/test/scala/com/geirolz/secret/circe/SecretCirceSuite.scala b/integrations/circe/src/test/scala/com/geirolz/secret/circe/SecretCirceSuite.scala index 9073726..d603387 100644 --- a/integrations/circe/src/test/scala/com/geirolz/secret/circe/SecretCirceSuite.scala +++ b/integrations/circe/src/test/scala/com/geirolz/secret/circe/SecretCirceSuite.scala @@ -1,7 +1,8 @@ package com.geirolz.secret.circe -import com.geirolz.secret.{OneShotSecret, Secret} +import com.geirolz.secret.{OneShotSecret, Secret, secretTag} import io.circe.Json +import io.circe.syntax.* class SecretCirceSuite extends munit.FunSuite: @@ -18,3 +19,17 @@ class SecretCirceSuite extends munit.FunSuite: result.toOption.get.euseAndDestroy(v => assert(v == "secret_value")) } + + test("Secret should be encoded to json") { + val secret: Secret[String] = Secret("secret_value") + val result: Json = secret.asJson + + assert(result == Json.fromString(secretTag)) + } + + test("OneShotSecret should be encoded to json") { + val secret: OneShotSecret[String] = OneShotSecret("secret_value") + val result: Json = secret.asJson + + assert(result == Json.fromString(secretTag)) + } diff --git a/integrations/circe/src/test/scala/com/geirolz/secret/circe/hashed/SecretCirceHashedSuite.scala b/integrations/circe/src/test/scala/com/geirolz/secret/circe/hashed/SecretCirceHashedSuite.scala new file mode 100644 index 0000000..d4354a5 --- /dev/null +++ b/integrations/circe/src/test/scala/com/geirolz/secret/circe/hashed/SecretCirceHashedSuite.scala @@ -0,0 +1,35 @@ +package com.geirolz.secret.circe.hashed + +import com.geirolz.secret.{secretTag, OneShotSecret, Secret} +import io.circe.Json +import io.circe.syntax.* + +class SecretCirceHashedSuite extends munit.FunSuite: + + test("Secret should be decoded from json") { + val json: Json = Json.fromString("secret_value") + val result = json.as[Secret[String]] + + result.toOption.get.euseAndDestroy(v => assert(v == "secret_value")) + } + + test("OneShotSecret should be decoded from json") { + val json = Json.fromString("secret_value") + val result = json.as[OneShotSecret[String]] + + result.toOption.get.euseAndDestroy(v => assert(v == "secret_value")) + } + + test("Secret should be encoded to json") { + val secret: Secret[String] = Secret("secret_value") + val result: Json = secret.asJson + + assert(result == Json.fromString(secret.hashed)) + } + + test("OneShotSecret should be encoded to json") { + val secret: OneShotSecret[String] = OneShotSecret("secret_value") + val result: Json = secret.asJson + + assert(result == Json.fromString(secret.hashed)) + }