packages feed

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