Skip to content

Commit

Permalink
Add Circe and Cats XML encoders (#33)
Browse files Browse the repository at this point in the history
* Add circe encoder

* Add cats xml encoders
  • Loading branch information
geirolz authored Jul 3, 2024
1 parent 1c2056c commit 9b33393
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
@@ -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

Expand All @@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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:

Expand All @@ -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))
}
Original file line number Diff line number Diff line change
@@ -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))
}
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
@@ -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:

Expand All @@ -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))
}
Original file line number Diff line number Diff line change
@@ -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))
}

0 comments on commit 9b33393

Please sign in to comment.