Я пишу общую функцию, используя shapeless, которая принимает экземпляр case class
и обрезает все значения полей, которые нить. Класс case может иметь необязательные поля, вложенные объекты, списки и т. д.
У меня есть класс корпуса Person
.
case class Person(name: Option[String], address: List[String], friends: List[Person])
Функция, которая у меня есть на данный момент:
import shapeless._, ops.hlist._
object trimmer extends Poly1 {
implicit val stringOptCase = at[Option[String]](_.map(_.trim))
implicit val stringListCase = at[List[String]](_.map(_.trim))
implicit def skipCase[A] = at[A](identity)
}
def trimStringValues[A, R <: HList](a: A)(implicit
gen: Generic.Aux[A, R],
mapper: Mapper.Aux[trimmer.type, R, R]
) = gen.from(mapper(gen.to(a)))
Когда я использую вышеуказанную функцию, она работает только для поля name
корневого уровня класса Person
. Это не работает для списка или поля объекта.
val person = Person(name = Some(" john "), address = List(" ny"," vegas "), friends = List(Person(Some(" alicia"), List(" peter"), Nil)))
trimStringValues(person) // Person(Some(john),List(ny, vegas),List(Person(Some( alicia),List( peter),List())))
Как я могу это решить?