packages feed

codec-0.1: Examples/Multi.hs

{-# LANGUAGE OverloadedStrings #-}

module Examples.Multi where

import Data.Aeson
import Data.Aeson.Codec
import Data.Codec

data Multi a
  = Con1 { foo :: String, bar :: Int }
  | Con2 { baz :: a }
  | Con3
  deriving Show

genFields ''Multi

multiCodec :: (ToJSON a, FromJSON a) => JSONCodec (Multi a)
multiCodec = obj "multi object" $ covered $ (
  cbuild c_Con1
    $   f_foo >-< "foo"
    >>> f_bar >-< "bar"
  ) <-> (
  cbuild c_Con2
    $ f_baz >-< "baz"
  ) <-> (
  cbuild c_Con3 done
  )