Similar to reactivemongo.bson.Macros.Options.UnionType but finds all implementations of the top trait automatically.
Similar to reactivemongo.bson.Macros.Options.UnionType but finds all implementations of the top trait automatically. For this to be possible the top trait has to be sealed. If your tree is deeper(class extends trait that extends top trait) all the intermediate traits have to be sealed too!
Example
sealed trait TopTrait case class OneImplementation(data: String) extends TopTrait case class SecondImplementation(data: Int) extends TopTrait sealed trait RefinedTrait extends TopTrait case class ThirdImplementation(data: Float, name: String) extends RefinedTrait case object StaticImplementation extends RefinedTrait val handler = Macros.handlerOpts[TopTrait, AllImplementations]
Default options that are implied if invoking "non-Opts" method.
Default options that are implied if invoking "non-Opts" method. All other options extend this.
In write
method also store class name(dynamic type) as a string
in a property named "className".
Same as SaveClassName but using the class’ simple name, io.
Same as SaveClassName but using the class’ simple name, io. the fully-qualified name.
Same as AllImplementations but saving the simple name io.
Same as AllImplementations but saving the simple name io. the fully-qualified name.
Same as UnionType but saving the class’ simple name io.
Same as UnionType but saving the class’ simple name io. the fully-qualified name.
to use in pattern matching. Listed in a "type list" \/
Use type parameter A
as static type but use pattern matching to handle
different possible subtypes.
Use type parameter A
as static type but use pattern matching to handle
different possible subtypes. This makes it easy to persist algebraic
data types(pattern where you have a sealed trait and several implementing
case classes). When writing a case class into BSON its dynamic type
will be pattern matched, when reading from BSON the pattern matching
will be done on the className
string. This option extends
reactivemongo.bson.Macros.Options.SaveClassName in to ensure class
names are always serialized.
If there are handlers available in implicit scope for any of the types in the union they will be used to handle (de)serialization, otherwise handlers for all types will be generated.
You can also use case object but you have to refer to their types as to singleton types. e.g. case object MyObject, type would be MyObject.type
Example
sealed trait Tree case class Node(left: Tree, right: Tree) extends Tree case class Leaf(data: String) extends Tree import Macros.Options._ implicit val treeHandler = Macros.handlerOpts[Tree, UnionType[Node \/ Leaf]]
to use in pattern matching. Listed in a "type list" \/
Print out generated code during compilation.
Type for making type-level lists for UnionType.
Type for making type-level lists for UnionType. If second parameter is another \/ it will be flattend out into a list and so on. Using infix notation makes much more sense since it then looks like a logical disjunction.
Foo \/ Bar \/ Baz
is interpreted as type Foo or type Bar or type Baz
Methods with 'Opts' postfix will take additional options in the form of type parameters that will customize behavior of the macros during compilation.