{-# LANGUAGE RankNTypes, OverloadedStrings, TemplateHaskell #-} module AWS.Lib.Convert where import Language.Haskell.TH import Control.Applicative ((<$>)) import Data.Text (Text) import AWS.Util mkConvertFunc :: String -> Name -> [String] -> Q [Dec] mkConvertFunc fs d strs = runQ $ do v <- newName "v" ctrs <- (\(TyConI (DataD [] _ [] x [])) -> map (\(NormalC name []) -> name) x) <$> reify d return $ [ SigD (mkName fs) (AppT (AppT ArrowT (ConT ''Text)) (ConT d)) , FunD (mkName fs) [Clause [VarP v] (NormalB (CaseE (VarE v) $ (map (\(s,t) -> Match (LitP (StringL s)) (NormalB (ConE t)) []) $ zip strs ctrs) ++ [Match WildP (NormalB (AppE (AppE (VarE 'err) (LitE (StringL $ show d))) (LitE (StringL $ show v)))) []]) ) []] ]