У меня есть этот пример кода:
import java.util.UUID
import shapeless.LabelledGeneric
import shapeless.record._
import shapeless.syntax.singleton._
object LabelTest extends App {
case class IncomingThing(name: String, age: Int)
case class DatabaseIncomingThing(name: String, age: Int, id: UUID)
val genIncoming = LabelledGeneric[IncomingThing]
val genDatabase = LabelledGeneric[DatabaseIncomingThing]
val thing = IncomingThing("John", 42)
val structuralVersionOfIncomingThing = genIncoming.to(thing)
val updated = genDatabase.from(structuralVersionOfIncomingThing + ('id ->> UUID.randomUUID()))
println(updated) // DatabaseIncomingThing(John,42,a45081f2-4ed5-4d2b-8fd9-4d8986875ed7)
}
Что приятно, потому что мне не нужно писать шаблон, который копирует все поля от IncomingThing
до DatabaseIncomingThing
. Однако мне бы не хотелось поддерживать оба этих типа, поскольку между ними существует очень четкая взаимосвязь (у одного есть id
, у другого - нет).
Есть ли способ создать тип из заданного класса case, добавив или удалив одно поле? Я представляю себе что-то вроде
type IncomingThing = withoutField[DatabaseIncomingThing]('id)
Или что-то в этом роде.