packages feed

chez-grater-0.0.1: src/Chez/Grater/Internal/Json.hs

module Chez.Grater.Internal.Json where

import Chez.Grater.Internal.Prelude

import Data.Aeson.TH
  ( Options, allNullaryToStringTag, constructorTagModifier, defaultOptions, fieldLabelModifier
  , omitNothingFields
  )
import Data.Char (toLower)
import Data.List (stripPrefix)

lowerFirst :: String -> String
lowerFirst ((toLower -> c) : cs) = c : cs
lowerFirst cs = cs

jsonOptions :: String -> Options
jsonOptions prefix = defaultOptions
  { fieldLabelModifier     = \field -> lowerFirst . fromMaybe field . stripPrefix prefix $ field
  , constructorTagModifier = lowerFirst
  , allNullaryToStringTag  = True
  , omitNothingFields      = True
  }