You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Decoding Aeson-encoded JSON in Swift.
Swift-equivalent of sum types - enums with parameters in cases - only supports the format that is equivalent to ObjectWithSingleField. Swift parses unnamed parameters from objects with keys "_0", "_1" etc., but an easy workaround is to have all parameters named, both in swift and in haskell.
The problem happens when some constructor has no parameters - Aeson always encodes it as an empty array, and Swift expects an empty object.
Proposal:
One of three options:
Add an additional option that would only be used for sum encodings, something like sumEncodingUseObjects to always encode constructor parameters as objects (with keys "_0", "_1" etc.).
An option nullaryToObject to encode nullary constructors as empty objects and keep constructors with parameters as is - records as objects, with positional parameters as arrays. Current decision to encode nullary constructors as array is quite arbitrary anyway, it simply follows positional parameters, but results in inconsistent JSON types if some constructors are records anyway...
An option sumEncodingAllRecordsNullaryToObject - probably too complex to reason about...
What I need is solved with option 2 - going to implement it in a fork...
The text was updated successfully, but these errors were encountered:
epoberezkin
changed the title
[feature] parameter for ObjectWithSingleField sum type encoding to allow decoding in Swift
[feature] an option for ObjectWithSingleField sum type encoding to allow decoding in Swift
Jan 29, 2022
If it doesn't look like a feature that's needed - I'll just add it in a fork - any pointers where it is would be great, right now a bit lost in the code...
Problem:
Decoding Aeson-encoded JSON in Swift.
Swift-equivalent of sum types - enums with parameters in cases - only supports the format that is equivalent to ObjectWithSingleField. Swift parses unnamed parameters from objects with keys "_0", "_1" etc., but an easy workaround is to have all parameters named, both in swift and in haskell.
The problem happens when some constructor has no parameters - Aeson always encodes it as an empty array, and Swift expects an empty object.
Proposal:
One of three options:
sumEncodingUseObjects
to always encode constructor parameters as objects (with keys "_0", "_1" etc.).nullaryToObject
to encode nullary constructors as empty objects and keep constructors with parameters as is - records as objects, with positional parameters as arrays. Current decision to encode nullary constructors as array is quite arbitrary anyway, it simply follows positional parameters, but results in inconsistent JSON types if some constructors are records anyway...sumEncodingAllRecordsNullaryToObject
- probably too complex to reason about...What I need is solved with option 2 - going to implement it in a fork...
The text was updated successfully, but these errors were encountered: