tdlib-gen-0.1.0: src/Language/Haskell/Codegen/TH.hs
{-# LANGUAGE TemplateHaskell #-}
module Language.Haskell.Codegen.TH where
import Codegen
import Data.Aeson.TH
import Data.Text (unpack)
import qualified Data.Text.IO as T
import Language.Haskell.Codegen
import Language.Haskell.TH
import Language.TL.Parser
import Processing
import Text.Megaparsec
adtInstanceDec :: ADT -> Q [Dec]
adtInstanceDec ADT {..} =
let con = mkName $ unpack name
opt = mkOption (mkModifier mapping)
in deriveJSON opt con
concatDec :: [Q [Dec]] -> Q [Dec]
concatDec = fmap (concat) . sequence
genDec :: FilePath -> Q [Dec]
genDec fp = do
adts <- runIO $ do
f <- T.readFile fp
let mprog = runParser program "td_api.tl" f
case mprog of
Left _ -> error "parse failed"
Right prog -> do
let (datas, functions) = convProgram prog
let adts = fmap (convADT defTyMap) datas
let funDefs = fmap (convFun defTyMap) functions
pure adts
concatDec $ fmap adtInstanceDec adts
genDec' :: FilePath -> Q [Dec]
genDec' fp = do
adts <- runIO $ do
f <- T.readFile fp
let mprog = runParser program "td_api.tl" f
case mprog of
Left _ -> error "parse failed"
Right prog -> do
let (datas, functions) = convProgram prog
let adts = fmap (convADT defTyMap) datas
let funDefs = fmap (convFun defTyMap) functions
pure (fmap paramADT funDefs)
concatDec $ fmap adtInstanceDec adts
instancesDec :: Q [Dec]
instancesDec = genDec "data/td_api.tl"
instancesDec' :: Q [Dec]
instancesDec' = genDec' "data/td_api.tl"
genFunDef :: TyMap -> FunDef -> Q [Dec]
genFunDef m d = undefined