ANN: codec: easy bidirectional serialization and first-class record construction

Tired of writing complementary parseJSON/toJSON, peek/poke or Binary get/put functions? codec https://github.com/chpatrick/codec provides easy bidirectional serialization of plain Haskell records in any Applicative context. All you need to do is provide a de/serializer for every record field in any order you like, and you get a de/serializer for the whole structure. The type system ensures that you provide every record exactly once. It also includes a library for general record construction in an Applicative context, of which creating codecs is just one application. *JSON:* data User = User { username :: Text , userEmail :: Text , userLanguages :: [ Text ] , userReferrer :: Maybe User } deriving Show genFields ''User userCodec :: JSONCodec User userCodec = obj "user object" $ User $>> f_username >-< "user" >>> f_userEmail >-< "email" >>> f_userLanguages >-< "languages" >>> f_userReferrer >-< opt "referrer" instance FromJSON User where parseJSON = parseVal userCodec instance ToJSON User where toJSON = produceVal userCodec *Bit fields:* ipv4Codec :: BinaryCodec IPv4 ipv4Codec = toBytes $ IPv4 $>> f_version >-< word8 4 >>> f_ihl >-< word8 4 >>> f_dscp >-< word8 6 >>> f_ecn >-< word8 2 >>> f_totalLength >-< word16be 16 >>> f_identification >-< word16be 16 >>> f_flags >-< word8 3 >>> f_fragmentOffset >-< word16be 13 >>> f_timeToLive >-< word8 8 >>> f_protocol >-< word8 8 >>> f_headerChecksum >-< word16be 16 >>> f_sourceIP >-< word32be 32 >>> f_destIP >-< word32be 32 instance Binary IPv4 where get = parse ipv4Codec put = produce ipv4Codec The same types and combinators can be used to make Storable or Binary instances, or used with pretty much any de/serialization library. The implementation only uses a little bit of Template Haskell to generate the f_... structures for each field and the rest is very basic in terms of extensions (no DataKinds or type families needed). Please take a look at the docs and the examples. I'd love to get some feedback before I put it on Hackage. :) All the best, Patrick
participants (1)
-
Patrick Chilton