{-# LANGUAGE ScopedTypeVariables #-}
module Main where
import Control.Monad (when)
import Data.List (nub)
import Text.Show.Pretty (ppShow)
import Options.Applicative (ParserInfo, execParser, info, (<**>), helper, idm)
import CodeGen.FileMappings
import CodeGen.Types
import CodeGen.Render (writeHaskellModule, parseFile)
import CLIOptions
-- ========================================================================= --
main :: IO ()
main = execParser opts >>= run
where
opts :: ParserInfo Options
opts = info (cliOptions <**> helper) idm
run :: Options -> IO ()
run os = do
when (verbose os) $ putStrLn $ unwords
[ "Running"
, show gentype
, "codegen for"
, show lib
, "files"
]
if supported lib
then do
mapM_ (runPipeline os) (files lib gentype)
when (verbose os) $ putStrLn "Done"
else putStrLn ("Code generation not enabled for " ++ show lib)
where
lib :: LibType
lib = libraries os
gentype :: CodeGenType
gentype = codegenType os
runPipeline
:: Options
-> (String, TemplateType -> [Function] -> HModule)
-> IO ()
runPipeline os (headerPath, makeModuleConfig) = do
-- TODO: @nub@ is a hack until proper treatment of
-- conditioned templates is implemented
bindingsUniq <- nub <$> parseFile (libraries os) (codegenType os) headerPath
when (verbose os) $ do
putStrLn $ "First signature of " ++ show (length bindingsUniq)
putStrLn $ ppShow (take 1 bindingsUniq)
mapM_ (writeHaskellModule bindingsUniq makeModuleConfig) typeList
when (verbose os) $
putStrLn $ "Number of functions generated: "
++ show (length typeList * length bindingsUniq)
where
typeList :: [TemplateType]
typeList = generatedTypes (libraries os) (codegenType os)