{-# LANGUAGE CPP #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Hpack.Syntax.Util (
  Generic
, genericParseJSON
, hyphenize
, module Data.Aeson.Types
) where

import qualified Data.Aeson.Types as Aeson
import           Data.Aeson.Types hiding (genericParseJSON)
import           Data.Data
import           GHC.Generics

import           Hpack.Syntax.GenericsUtil

#if MIN_VERSION_aeson(1,0,0)
genericParseJSON :: forall a d m. (GFromJSON Zero (Rep a), HasTypeName a d m) => Value -> Parser a
#else
genericParseJSON :: forall a d m. (GFromJSON (Rep a), HasTypeName a d m) => Value -> Parser a
#endif
genericParseJSON = Aeson.genericParseJSON defaultOptions {fieldLabelModifier = hyphenize name}
  where
    name :: String
    name = typeName (Proxy :: Proxy a)

hyphenize :: String -> String -> String
hyphenize name =
#if MIN_VERSION_aeson(0,10,0)
  camelTo2
#else
  camelTo
#endif
  '-' . drop (length (dropWhile (== '_') $ reverse name)) . dropWhile (== '_')