Quero converter a classe de caso UserDTO para a classe de caso User. Encontro a solução na conversão de classe de caso sem forma.
class SameFieldConverter[T] {
def apply[S, SR <: HList, TR <: HList, MR <: HList, IR <: HList](s: S)(implicit
genS: LabelledGeneric.Aux[S, SR],
genT: LabelledGeneric.Aux[T, TR],
merger: Merger.Aux[SR, HNil, MR],
intersection: Intersection.Aux[MR, TR, IR],
align: Align[IR, TR]) = genT.from(intersection(merger(genS.to(s), HNil)))
mas tenho problemas com campos diferentes, por exemplo, em UserDTO tenho o nome do campo, sobrenome, mas em User tenho o nome completo.
case class UserDTO(name:String, surname:String, age:Int){
def toDomain:User = User(name + surname, age)
}
case class User(fullName:String, age:Int)
Também tenho problemas com nomes de campos diferentes, por exemplo, nome -> sobrenome
case class UserDTO(name:String, surname:String, age:Int)
case class User(firstName:String, surname:String, age:Int)
Eu penso sobre a solução como em um alias de pena ("nome", _.surname), mas tenho um cérebro pequeno. Eu também estava pensando em olhar para o uso da API de reflexão scala
Se você quer apenas converter de uma classe de caso para outra classe de caso onde ambas têm campos iguais ou similares, acho que shapeless é um exagero. Eu escolheria chimney para algo assim. O código deve ser parecido com
build.sbt
Transformer.scala
e um método principal fictício deve se parecer com
Main.scala
A saída será