{- This Source Code Form is subject to the terms of the Mozilla Public License,
   v. 2.0. If a copy of the MPL was not distributed with this file, You can
   obtain one at https://mozilla.org/MPL/2.0/. -}

module TeaCleaner.Options
    ( jsonOptions
    ) where

import qualified Data.Aeson.TH as Aeson
import Prelude hiding (id)
import Data.Char

applyFirst :: (Char -> Char) -> String -> String
applyFirst _ []     = []
applyFirst f [x]    = [f x]
applyFirst f (x:xs) = f x: xs

-- | Generic casing for symbol separated names
symbCase :: String -> String
symbCase = u . applyFirst toLower
  where u []                       = []
        u (x:xs) | isUpper x = '_' : toLower x : u xs
                 | otherwise = x : u xs

jsonOptions :: Aeson.Options
jsonOptions = Aeson.defaultOptions
    { Aeson.fieldLabelModifier = symbCase
    }