Skip to content

Commit

Permalink
Parameterised Secret and made the number of stars used not the same l…
Browse files Browse the repository at this point in the history
…ength as the underlying value
  • Loading branch information
Michaelt293 committed Dec 24, 2018
1 parent 51d0b47 commit 1401b5b
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 11 deletions.
40 changes: 34 additions & 6 deletions macros/src/main/scala/com/thaj/safe/string/interpolator/Safe.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,51 @@ package com.thaj.safe.string.interpolator

trait Safe[A] {
def value(a: A): String
def hiddenLength: Int
}

object Safe {
def apply[T](implicit ev: Safe[T]): Safe[T] = ev

def instance[A](f: A => String, length: Int): Safe[A] =
new Safe[A] {
def value(a: A): String = f(a)
val hiddenLength: Int = length
}

implicit val safeString: Safe[String] =
identity[String]
instance(identity[String], 10)

implicit val safeByte: Safe[Byte] =
instance(_.toString, 3)

implicit val safeShort: Safe[Short] =
instance(_.toString, 5)

implicit val safeInt: Safe[Int] =
_.toString
instance(_.toString, 10)

implicit val safeLong: Safe[Long] =
_.toString
instance(_.toString, 10)

implicit val safeBigInt: Safe[BigInt] =
instance(_.toString, 10)

implicit val safeFloat: Safe[Float] =
instance(_.toString, 10)

implicit val safeDouble: Safe[Double] =
_.toString
instance(_.toString, 10)

implicit val safeBigDecimal: Safe[BigDecimal] =
instance(_.toString, 10)

implicit val safeChar: Safe[Char] =
_.toString
}
instance(_.toString, 1)

implicit val safeBoolean: Safe[Boolean] =
instance(_.toString, 5)

implicit def safeOption[A: Safe]: Safe[Option[A]] =
instance(_.fold("")(_.toString), Safe[A].hiddenLength)
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package com.thaj.safe.string.interpolator

// No need of annotation macros
final case class Secret(value: String) extends AnyVal
final case class Secret[A](value: A) extends AnyVal

object Secret {
implicit val secretString: Safe[Secret] =
(a: Secret) => List.fill(a.value.length)("*").mkString
implicit def secretString[A: Safe]: Safe[Secret[A]] =
Safe.instance(
_ => "*" * Safe[A].hiddenLength,
Safe[A].hiddenLength
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ object SafeStringSpec extends Specification with ScalaCheck {

final case class Dummy(name: String, age: Int)

final case class DummyWithSecret(name: String, secret: Secret)
final case class DummyWithSecret[A](name: String, secret: Secret[A])

private def test = prop { (a: String, b: String, c: Int, d: Int) => {
val res: String = (c + d).toString
Expand All @@ -25,6 +25,6 @@ object SafeStringSpec extends Specification with ScalaCheck {
private def testSecrets = prop { (a: String, b: String) => {
val dummy = DummyWithSecret(a, Secret(b))
safeStr"the safe string with password, ${a}, $dummy".string must_===
s"the safe string with password, $a, { secret: ${List.fill(b.toString.length)("*").mkString}, name: ${dummy.name} }"
s"the safe string with password, $a, { secret: ${"*" * 10}, name: ${dummy.name} }"
}}
}

0 comments on commit 1401b5b

Please sign in to comment.