shimmer-0.1.3.1: 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.Core.Codec as Codec
import SMR.Core.Exp (Decl)
import SMR.Prim.Op.Base (Prim)
import qualified Data.ByteString as BS
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.primNames }
case Source.parseDecls config ts of
Left err -> error $ show err
Right decls -> return decls
-- Somee other file.
| otherwise
= do
bs <- BS.readFile path
let magicSMR = BS.pack [0x53, 0x4d, 0x52, 0x31]
when (not $ BS.isPrefixOf magicSMR (BS.take 4 bs))
$ error "runLoadFileDecls: cannot load this file"
return $ Codec.unpackFileDecls bs