Извлечь значения метки из экземпляра LabelledGeneric

Рассмотрим следующий пример:

import shapeless._

case class Foo(bar: String, baz: Boolean)
val labl = LabelledGeneric[Foo]

Теперь тип labl есть (предварительно)

LabelledGeneric[Foo] {
  type Repr =
    FieldType[Symbol @@ String("bar"), String] ::
    FieldType[Symbol @@ String("baz"), Boolean] ::
    HNil
}

которая уже передает необходимую мне информацию, то есть имена полей класса case.

То, что я ищу, это путь от labl к чему-то вроде

"bar" :: "baz" :: HNil

т.е. материализация информации, содержащейся в синглтон-типах, в значение.

Это возможно? Я мог бы использовать макрос, но я чувствую, что в конечном итоге переписал бы что-то очень похожее на GenericMacros объект бесформенный, поэтому мне интересно, могу ли я использовать его напрямую.

1 ответ

Решение

Вы можете получить ключи записи (как Symbols) через shapeless.ops.record.Keys,

это

import shapeless._
import shapeless.ops.record._

case class Foo(bar: String, baz: Boolean)
val labl = LabelledGeneric[Foo]
val keys = Keys[labl.Repr].apply
println(keys)
println(keys.toList.map(_.name))

результаты в

'bar :: 'baz :: HNil
List(bar, baz) : List(String)
Другие вопросы по тегам