{-# LANGUAGE TemplateHaskell #-}
module Verismith.Verilog.Quote
( verilog
)
where
import Data.Data
import qualified Data.Text as T
import qualified Language.Haskell.TH as TH
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Syntax
import Verismith.Verilog.Parser
liftDataWithText :: Data a => a -> Q Exp
liftDataWithText = dataToExpQ $ fmap liftText . cast
liftText :: T.Text -> Q Exp
liftText txt = AppE (VarE 'T.pack) <$> lift (T.unpack txt)
verilog :: QuasiQuoter
verilog = QuasiQuoter
{ quoteExp = quoteVerilog
, quotePat = undefined
, quoteType = undefined
, quoteDec = undefined
}
quoteVerilog :: String -> TH.Q TH.Exp
quoteVerilog s = do
loc <- TH.location
let pos = T.pack $ TH.loc_filename loc
v <- case parseVerilog pos (T.pack s) of
Right e -> return e
Left e -> fail $ show e
liftDataWithText v