Здесь я должен рассматривать классы, которые имеют в основном одни и те же поля.
final case class Id(id: String) // Param Class
final case class Age(id: Id, age: Int) // Param Class
final case class A(id: Id, data: Map[String, Any], age: Age) extends Presentable[A, APre] // Main Class 1
final case class APre(id: String, data: Map[String, Any], age: Int) // Main Class 2
Здесь A
и APre
— мои основные классы.
Теперь я хочу преобразовать эти два класса с помощью Shapeless, поэтому я пишу следующую псевдофункцию:
trait Presentable[E, P] {
def makePresentation[ET <: HList, PT <: HList](entity: E)(func : ET => PT)(implicit entGen: LabelledGeneric.Aux[E, ET], preGen: LabelledGeneric.Aux[P, PT]): P = {
val entList = entGen.to(entity)
preGen.from(func(entList))
}
}
Здесь func
— это преобразователь, отображающий HList
из A
в HList
из APre
(или наоборот).
И я хочу использовать такую функцию:
val age = Age(Id("age_1"), 18)
val a = A(Id("id"), Map("tag1" -> "value1", "tag2" -> "value2"), age)
val pre = a.makePresentation { entList =>
entList.updateWith('id)((id: Id) => id.id).updateWith('age)((a: Age) => a.age)
}
Здесь я могу сам подразумевать функцию отображения. Поэтому я могу преобразовать любые два класса case
Итак, вопросы: 1. Как я могу преобразовать эти два класса, используя shapeless? 2. На самом деле у меня есть куча пар классов от A
до APre
. Итак, я хочу, чтобы trait
извлекал эту функцию преобразования, используя универсальный. Как написать эту функцию?