packages feed

haspara-0.0.0.3: src/Haspara/Internal/Aeson.hs

-- | This module provides helper definitions for "Data.Aeson".

module Haspara.Internal.Aeson where

import qualified Data.Aeson as Aeson
import qualified Data.Char  as C
import           Data.List  (stripPrefix)
import           Data.Maybe (fromMaybe)


-- | Common Aeson encoding/decoding options.
commonAesonOptions :: String -> Aeson.Options
commonAesonOptions prefix =
  Aeson.defaultOptions
    { Aeson.omitNothingFields = True
    , Aeson.fieldLabelModifier = \l -> Aeson.camelTo2 '_' . fromMaybe l $ stripPrefix prefix l
    , Aeson.constructorTagModifier = \l -> Aeson.camelTo2 '_' . fromMaybe l $ stripPrefix prefix l
    , Aeson.sumEncoding = Aeson.TaggedObject
        { Aeson.tagFieldName = "type"
        , Aeson.contentsFieldName = "value"
        }
    }


-- | Aeson encoding/decoding options for uppercase constructor tag modifiers
aesonOptionsForSingleTag :: String -> Aeson.Options
aesonOptionsForSingleTag prefix =
  Aeson.defaultOptions
    { Aeson.constructorTagModifier = \l -> fmap C.toUpper . Aeson.camelTo2 '_' . fromMaybe l $ stripPrefix prefix l
    }