Product types are disambiguated by a (:key value ...).
Product types are disambiguated by an extra layer containing a single key which is the name of the type of product contained in the value.
Sometimes the wire format needs to match an existing format and
SexpNil behaviour needs to be customised.
a SexpFormat[HList] or SexpFormat[Coproduct] would not retain the
type information for the full generic that it is serialising.
a SexpFormat[HList] or SexpFormat[Coproduct] would not retain the
type information for the full generic that it is serialising.
This allows us to pass the wrapped type, achieving: 1) custom
CoproductHints on a per-trait level 2) configurable null behaviour
on a per product level 3) clearer error messages.
This is intentionally not an SexpFormat to avoid ambiguous
implicit errors, even though it implements its interface.
All values serialising to SexpNil will be included in the wire format.
No values serialising to SexpNil will be included in the wire format.
Format for LabelledGenerics that uses the HList or Coproduct
marshaller above.
Format for LabelledGenerics that uses the HList or Coproduct
marshaller above.
Blah.Aux[T, Repr] is a trick to work around scala compiler
constraints. We'd really like to have only one type parameter
(T) implicit list g: LabelledGeneric[T], f:
Cached[Strict[SexpFormat[T.Repr]]] but that's not possible.
Automatically create product/coproduct marshallers (i.e. families of sealed traits and case classes/objects) for s-express.
This uses s-expression data as the underlying format, as opposed to alists. Alists are arguably a better wire format because they allow for arbitrarily complex keys, but we're applying the Principle of Least Power.
Based on spray-json-shapeless, with the same caveats.