packages feed

ddc-tools-0.4.2.1: src/ddci-core/DDCI/Core/Command/With.hs

module DDCI.Core.Command.With
        (cmdWith, cmdWithSalt)
where
import DDCI.Core.State
import DDC.Driver.Interface.Source
import DDC.Build.Pipeline
import DDC.Core.Pretty
import DDC.Core.Module
import DDC.Core.Check
import DDC.Data.Canned
import System.Directory
import Control.Monad
import Data.IORef
import Data.Char
import qualified DDC.Core.Check                 as C
import qualified DDC.Build.Language.Salt        as Salt
import qualified Data.Map                       as Map


-- | Add a module to the inliner table.
cmdWith :: State -> Source -> String -> IO State
cmdWith state _source str
 | Language bundle      <- stateLanguage  state
 , modules              <- bundleModules  bundle
 , fragment             <- bundleFragment bundle
 = do   res <- cmdWith_load fragment str
        case res of
          Nothing  -> return state
          Just mdl 
           -> do
                let modules' = Map.insert (moduleName mdl) mdl modules 
                let bundle'  = bundle { bundleModules = modules' }
                return $ state { stateLanguage = Language bundle' }


cmdWithSalt :: State -> Source -> String -> IO State
cmdWithSalt state _source str
 = do   res <- cmdWith_load Salt.fragment str
        case res of
          Nothing  -> return state
          Just mdl 
           -> return $ state
                     { stateWithSalt = Map.insert (moduleName mdl) mdl 
                                                  (stateWithSalt state) }


cmdWith_load frag str
 = do   -- Always treat the string as a filename
        let source   = SourceFile str

        -- Read in the source file.
        let filePath = dropWhile isSpace str
        exists  <- doesFileExist filePath
        when (not exists)
         $      error $ "No such file " ++ show filePath

        src     <- readFile filePath

        cmdWith_parse frag source src


cmdWith_parse frag source src
 = do   ref     <- newIORef Nothing
        errs    <- pipeText (nameOfSource source) (lineStartOfSource source) src
                $  PipeTextLoadCore frag C.Recon SinkDiscard
                [  PipeCoreReannotate (\a -> a { annotTail = ()})
                [ PipeCoreHacks (Canned (\m -> writeIORef ref (Just m) >> return m)) 
                [ PipeCoreOutput pprDefaultMode SinkDiscard] ]]

        case errs of
         [] -> do
                putStrLn "ok"
                readIORef ref

         _ -> do
                mapM_ (putStrLn . renderIndent . ppr) errs
                return Nothing