Copyright | (c) 2011 2012 Bryan O'Sullivan (c) 2011 MailRank Inc. |
---|---|
License | Apache |
Stability | experimental |
Portability | portable |
Safe Haskell | None |
Language | Haskell2010 |
Functions to mechanically derive ToDatum
and FromDatum
instances. Note that
you need to enable the TemplateHaskell
language extension in order to use this
module.
An example shows how instances are generated for arbitrary data types. First we define a data type:
data D a = Nullary | Unary Int | Product String Char a | Record { testOne :: Double , testTwo :: Bool , testThree :: D a } deriving Eq
Next we derive the necessary instances. Note that we make use of the feature to change record field names. In this case we drop the first 4 characters of every field name. We also modify constructor names by lower-casing them:
$(deriveDatum
defaultOptions
{fieldLabelModifier
=drop
4,constructorTagModifier
= map toLower} ''D)
Now we can use the newly created instances.
d :: DInt
d = Record { testOne = 3.14159 , testTwo =True
, testThree = Product "test" 'A' 123 }
>>>
fromDatum (toDatum d) == Success d
> True
Please note that you can derive instances for tuples using the following syntax:
-- FromDatum and ToDatum instances for 4-tuples. $(deriveDatum
defaultOptions
''(,,,))
- data Options :: * = Options {}
- data SumEncoding :: *
- defaultOptions :: Options
- defaultTaggedObject :: SumEncoding
- deriveDatum :: Options -> Name -> Q [Dec]
- deriveToDatum :: Options -> Name -> Q [Dec]
- deriveFromDatum :: Options -> Name -> Q [Dec]
- mkToDatum :: Options -> Name -> Q Exp
- mkParseDatum :: Options -> Name -> Q Exp
Encoding configuration
Options that specify how to encode/decode your datatype to/from JSON.
Options | |
|
data SumEncoding :: * #
Specifies how to encode constructors of a sum datatype.
TaggedObject | A constructor will be encoded to an object with a field
|
UntaggedValue | Constructor names won't be encoded. Instead only the contents of the constructor will be encoded as if the type had single constructor. JSON encodings have to be disjoint for decoding to work properly. When decoding, constructors are tried in the order of definition. If some encodings overlap, the first one defined will succeed. Note: Nullary constructors are encoded as the string (using
Note: Only the last error is kept when decoding, so in the case of mailformed JSON, only an error for the last constructor will be reported. |
ObjectWithSingleField | A constructor will be encoded to an object with a single
field named after the constructor tag (modified by the
|
TwoElemArray | A constructor will be encoded to a 2-element array where the
first element is the tag of the constructor (modified by the
|
Default encoding Options
:
Options
{fieldLabelModifier
= id ,constructorTagModifier
= id ,allNullaryToStringTag
= True ,omitNothingFields
= False ,sumEncoding
=defaultTaggedObject
,unwrapUnaryRecords
= False }
defaultTaggedObject :: SumEncoding #
Default TaggedObject
SumEncoding
options:
defaultTaggedObject =TaggedObject
{tagFieldName
= "tag" ,contentsFieldName
= "contents" }
FromDatum and ToDatum derivation
:: Options | Encoding options. |
-> Name | Name of the type for which to generate |
-> Q [Dec] |
Generates both ToDatum
and FromDatum
instance declarations for the given
data type.
This is a convienience function which is equivalent to calling both
deriveToDatum
and deriveFromDatum
.
:: Options | Encoding options. |
-> Name | Name of the type for which to generate a |
-> Q [Dec] |
Generates a ToDatum
instance declaration for the given data type.
:: Options | Encoding options. |
-> Name | Name of the type for which to generate a |
-> Q [Dec] |
Generates a FromDatum
instance declaration for the given data type.
Generates a lambda expression which encodes the given data type as Datum.