{-# LANGUAGE OverloadedStrings #-}

module Examples.JSON where

import Data.Aeson
import Data.Aeson.Codec
import Data.Codec
import Data.Text (Text)

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" -- entry with FromJSON/ToJSON serialization
    >>> f_userEmail     >-< "email"
    >>> f_userLanguages >-< "languages"
    >>> f_userReferrer  >-< opt (entry "referrer" userCodec) -- entry with specific codec

instance FromJSON User where
  parseJSON = parseVal userCodec

instance ToJSON User where
  toJSON = produceVal userCodec