module Network.Nakadi.Internal.TH where
import Control.Lens
import Data.Char
import Data.List
import Data.Maybe
import Language.Haskell.TH
import Prelude
makeNakadiLenses :: Name -> DecsQ
makeNakadiLenses = makeLensesWith nakadiLensRules
nakadiLensNamer :: FieldNamer
nakadiLensNamer _ _ field = maybeToList $ do
fieldUnprefixed <- stripPrefix "_" (nameBase field)
let className = "HasNakadi" ++ overHead toUpper fieldUnprefixed
methodName = fieldUnprefixed
return (MethodName (mkName className) (mkName methodName))
nakadiLensRules :: LensRules
nakadiLensRules = defaultFieldRules & lensField .~ nakadiLensNamer
overHead :: (a -> a) -> [a] -> [a]
overHead _ [] = []
overHead f (x : xs) = f x : xs