Извлечь значения меток из экземпляра 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)