Is there a way to tag a generated shapeless LabelledGeneric
with information about annotations on fields?
For example
case class Example(@someAnnotation foo: Foo, bar: Bar)
could we get something like
FieldType["foo" with Annotations(someAnnotation :: HNil), Foo] :: FieldType["bar", Bar] :: HNil
?
CodePudding user response:
You can have HLists FieldType['foo, Foo] :: FieldType['bar, Bar] :: HNil
and Some[someAnnotation] :: None.type :: HNil
using type classes shapeless.LabelledGeneric
, shapeless.Annotations
implicitly[LabelledGeneric.Aux[Example,
FieldType[Witness.`'foo`.T, Foo] :: FieldType[Witness.`'bar`.T, Bar] :: HNil]]
implicitly[Annotations.Aux[someAnnotation, Example,
Some[someAnnotation] :: None.type :: HNil]]
Please notice that 'foo
, 'bar
(written as Witness.`'foo`.T
, Witness.`'bar`.T
for technical reasons) are singleton types that are subtypes of Symbol
, not String
.
If you really need an HList of intersections (with
) or tuples (fieldName, annotation)
then you can zip the HLists using one of type classes shapeless.ops.hlist.Zip
, shapeless.ops.hlist.ZipOne
, shapeless.ops.hlist.ZipWith
.