shimmer-0.1.1: src/SMR/CLI/Driver/Load.hs
module SMR.CLI.Driver.Load
(runLoadFileDecls)
where
import qualified SMR.Prim.Op as Prim
import qualified SMR.Prim.Name as Prim
import qualified SMR.Source.Parser as Source
import qualified SMR.Source.Lexer as Source
import qualified SMR.Codec.Peek as Codec
import SMR.Core.Exp (Decl)
import SMR.Prim.Op.Base (Prim)
import qualified Foreign.Marshal.Alloc as Foreign
import qualified System.FilePath as System
import qualified System.IO as System
import Control.Monad
import Data.Text (Text)
-- | Load decls from the given file.
runLoadFileDecls :: FilePath -> IO [Decl Text Prim]
runLoadFileDecls path
-- Shimmer text source file.
| System.takeExtension path == ".smr"
= do str <- readFile path
let (ts, _loc, _csRest)
= Source.lexTokens (Source.L 1 1) str
let config
= Source.Config
{ Source.configReadSym = Just
, Source.configReadPrm = Prim.readPrim Prim.primOpTextNames }
case Source.parseDecls config ts of
Left err -> error $ show err
Right decls -> return decls
-- Shimmer binary store file.
| System.takeExtension path == ".sms"
= do
h <- System.openBinaryFile path System.ReadMode
nSize <- fmap fromIntegral $ System.hFileSize h
Foreign.allocaBytes nSize $ \pBuf
-> do nRead <- System.hGetBuf h pBuf nSize
when (nRead /= nSize) $ error "runConvert: short read"
(decls, _p, _n) <- Codec.peekFileDecls pBuf nSize
return decls
| otherwise
= error "runLoadFileDecls: cannot load this file"