{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE UndecidableInstances #-}
module Fly.Internal.DhallWithPrefix where

import Control.Monad.Trans.State.Strict
import Data.Aeson
import Data.Aeson.Casing
import Data.Text
import Dhall
import GHC.Generics

newtype FromDhallWithPrefix a = FromDhallWithPrefix a

instance (Generic a, GenericFromDhall (Rep a)) => FromDhall (FromDhallWithPrefix a) where
  autoWith opts =
    let modifier = pack . fieldLabelModifier (aesonPrefix snakeCase) . unpack
    in FromDhallWithPrefix <$> fmap GHC.Generics.to (evalState (genericAutoWith opts{fieldModifier = modifier}) 1)