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

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

import shapeless._

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

Теперь тип labl (prettified)

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

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

То, что я ищу, - это способ перейти от labl к чему-то по строкам

"bar" :: "baz" :: HNil

то есть. материализуя информацию, содержащуюся в одноэлементных типах, в значение.

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

Ответы

Ответ 1

Вы можете получить ключи записи (как Symbol s) через 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)