{-# LANGUAGE TemplateHaskell #-}

module Cloud.AWS.Lib.ToText.TH
    ( deriveToText
    ) where

import Control.Applicative ((<$>))
import Language.Haskell.TH

import Cloud.AWS.Lib.ToText.Class (ToText(..))

deriveToText :: String -> [String] -> DecsQ
deriveToText name value = do
    let dname = mkName name
    (TyConI (DataD _ _ _ cs _)) <- reify dname
    let clauses = map
            (\(npq, str) -> clause [npq] (normalB $ stringE str) [])
            (zip (map (\(NormalC n _) -> conP n []) cs) value)
    let fun = funD 'toText clauses
    let typ = appT (conT ''ToText) (conT dname)
    (:[]) <$> instanceD (return []) typ [fun]