Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Circe and Cats XML encoders #33

Merged
merged 2 commits into from
Jul 3, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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

@@ -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
@@ -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))
}
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:

@@ -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))
}