module Text.HPaco.Readers.Paco.Include where import Control.Monad import Control.Monad.IO.Class import System.IO.Strict import System.FilePath import System.IO (withFile, IOMode (ReadMode)) import Text.HPaco.Readers.Paco.Basics import Text.HPaco.Readers.Paco.ParserInternals import Text.HPaco.Readers.Paco.Expressions import Text.HPaco.AST.AST import Text.HPaco.AST.Statement import Text.HPaco.AST.Expression import Text.HPaco.AST.Identifier performInclude :: String -> Maybe (Identifier, Expression) -> Parser Statement performInclude basename innerContext = do dirname <- psBasePath `liftM` getState extension <- psIncludeExtension `liftM` getState reader <- psHandleInclude `liftM` getState let fn0 = joinPath [ dirname, basename ] let fn = maybe fn0 (fillExtension fn0) extension src <- liftIO $ withFile fn ReadMode hGetContents subAst <- liftIO $ reader fn src let stmt = astRootStatement subAst modifyState (\s -> s { psDeps = fn:psDeps s ++ astDeps subAst }) modifyState (\s -> s { psDefs = psDefs s ++ astDefs subAst }) return $ maybe stmt (\(ident, expr) -> LetStatement ident expr stmt) innerContext where