module Data.Ini.QQ
( ini
) where
import Data.Data
import Data.Ini
import qualified Data.Text as T
import Language.Haskell.TH
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
liftText :: T.Text -> Q Exp
liftText txt = AppE (VarE 'T.pack) <$> lift (T.unpack txt)
liftDataWithText :: Data a => a -> ExpQ
liftDataWithText = dataToExpQ (\a -> liftText <$> cast a)
ini :: QuasiQuoter
ini = QuasiQuoter {
quoteExp = iniExp,
quotePat = \s -> error "No quotePat defined for ini",
quoteType = \s -> error "No quoteType defined for ini",
quoteDec = \s -> error "No quoteDec defined for ini"
}
iniExp :: String -> ExpQ
iniExp txt =
case parseIni (T.pack txt) of
Left err -> error ("Error in iniExp: " ++ show err)
Right val -> toExpQ val
toExpQ :: Ini -> ExpQ
toExpQ (Ini m) = do
e <- liftDataWithText m
return $ AppE (ConE $ mkName "Data.Ini.Ini") e