module Text.StringTemplate.QQ (stmp) where
import qualified Language.Haskell.TH as TH
import Language.Haskell.TH.Quote
import Text.StringTemplate.Base
import Control.Monad.Writer
quoteTmplExp :: String -> TH.ExpQ
quoteTmplPat :: String -> TH.PatQ
stmp :: QuasiQuoter
stmp = QuasiQuoter quoteTmplExp quoteTmplPat
quoteTmplPat = error "Cannot apply stmp quasiquoter in patterns"
quoteTmplExp s = return tmpl
where
vars = case parseSTMPNames s of
Right xs -> xs
Left err -> error $ show err
base = TH.AppE (TH.VarE (TH.mkName "newSTMP")) (TH.LitE (TH.StringL $ s))
tmpl = foldr addAttrib base vars
addAttrib var x = TH.AppE
(TH.AppE (TH.AppE (TH.VarE (TH.mkName "setAttribute"))
(TH.LitE (TH.StringL ('`' : var ++ "`"))))
(TH.VarE (TH.mkName var)))
x