You can use shapeless to do this:
import shapeless._
import shapeless.ops.hlist._
object Trimmer extends Poly1 {
implicit val stringTrim = at[String] { _.trim }
implicit def noop[T] = at[T] { identity }
}
def trimCaseClass[C, H <: HList](c: C)
(implicit g: Generic.Aux[C, H], m: Mapper.Aux[Trimmer.type, H, H]): C = {
val hlist = g.to(c)
val trimmed = hlist.map(Trimmer)
g.from(trimmed)
}
Then:
scala> case class A(s1: String, s2: String, i: Int)
defined class A
scala> val a = A(" 1 ", "2", 3)
a: A = A( 1 ,2,3)
scala> trimCaseClass(a)
res0: A = A(1,2,3)
Marth source
share