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 :: String -> String
lowerFirst ((Char -> Char
toLower -> Char
c) : String
cs) = Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String
cs
lowerFirst String
cs = String
cs

jsonOptions :: String -> Options
jsonOptions :: String -> Options
jsonOptions String
prefix = Options
defaultOptions
  { fieldLabelModifier :: String -> String
fieldLabelModifier     = \String
field -> String -> String
lowerFirst (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe String -> String
forall a. a -> Maybe a -> a
fromMaybe String
field (Maybe String -> String)
-> (String -> Maybe String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> Maybe String
forall a. Eq a => [a] -> [a] -> Maybe [a]
stripPrefix String
prefix (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String
field
  , constructorTagModifier :: String -> String
constructorTagModifier = String -> String
lowerFirst
  , allNullaryToStringTag :: Bool
allNullaryToStringTag  = Bool
True
  , omitNothingFields :: Bool
omitNothingFields      = Bool
True
  }