Извлечь значения метки из экземпляра 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 ответ
Решение
Вы можете получить ключи записи (как 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)