By Brad Fritz / @bfritz
val lang = "Scala"
println(s"I like $lang")
I like Scala
s"I like $lagn"
<console>:8: error: not found: value lagn
s"I like $lagn"
^
val sum = 2.0
f"1.0 + 1.0 = $sum%1.1f"
1.0 + 1.0 = 2.0
val sum = 2.0
f"1.0 + 1.0 = $sum%1d"
<console>:9: error: type mismatch;
found : Double
required: Int
f"1.0 + 1.0 = $sum%1d"
^
implicit class Base64String(val sc: StringContext)
extends AnyVal {
def b64(args: String*): String = {
// secret sauce:
// transform args and context into
// new string
}
}
val msg = "secret"
b64"base64(secret): $msg"
// calls new StringContext("base64(secret): ").b64(msg)
base64(secret): c2VjcmV0
import com.google.common.base.Charsets.US_ASCII
import com.google.common.io.BaseEncoding.base64
// Based on Scala's StringContext class:
// https://github.com/scala/scala/blob/v2.10.0/src/library/scala/StringContext.scala
implicit class Base64String(val sc: StringContext) extends AnyVal {
def b64(args: String*): String = {
if (sc.parts.length != args.length + 1)
throw new IllegalArgumentException(
"wrong number of arguments for b64 interpolated string")
val strings = sc.parts.iterator
val expressions = args.iterator
val bldr = new java.lang.StringBuilder(strings.next)
while (expressions.hasNext) {
bldr append strings.next
bldr append base64().encode(expressions.next.getBytes(US_ASCII))
}
bldr.toString
}
}