shimmer-0.1.3.1: Main.hs
module Main where
import qualified SMR.CLI.Config as Config
import qualified SMR.CLI.Repl as Repl
import qualified SMR.CLI.Driver.Load as Driver
import qualified SMR.Core.World as World
import qualified SMR.Source.Pretty as Source
import qualified SMR.Core.Codec as Codec
import qualified SMR.Core.Codec as Codec
import qualified Foreign.Marshal.Alloc as Foreign
import qualified System.Environment as System
import qualified System.FilePath as System
import qualified System.IO as System
import qualified Data.Text.Lazy.IO as TL
import qualified Data.Text.Lazy.Builder as BL
import qualified Data.Maybe as Maybe
import Data.Monoid
-------------------------------------------------------------------------------
main :: IO ()
main
= do args <- System.getArgs
config <- Config.parseArgs args Config.configZero
case Config.configMode config of
Config.ModeNone
-> runRepl Nothing
Config.ModeREPL mFile
-> runRepl mFile
Config.ModeLoad file
-> runLoad file
Config.ModeConvert file1 file2
-> runConvert file1 file2
-------------------------------------------------------------------------------
runRepl :: Maybe FilePath -> IO ()
runRepl mPath
= do world <- World.newWorld ()
Repl.replStart
$ Repl.State
{ Repl.stateMode = Repl.ModeNone
, Repl.stateDecls = []
, Repl.stateFiles = Maybe.maybeToList mPath
, Repl.stateWorld = world }
-------------------------------------------------------------------------------
runLoad :: FilePath -> IO ()
runLoad path
= do decls <- Driver.runLoadFileDecls path
TL.putStr
$ BL.toLazyText
$ mconcat
$ [Source.buildDecl d <> BL.fromString "\n" | d <- decls]
-------------------------------------------------------------------------------
runConvert :: FilePath -> FilePath -> IO ()
runConvert pathSrc pathDst
-- Encode text shimmer file to binary store.
| System.takeExtension pathSrc == ".smr"
, System.takeExtension pathDst == ".sms"
= do
decls <- Driver.runLoadFileDecls pathSrc
let len = Codec.sizeOfFileDecls decls
Foreign.allocaBytes len $ \pBuf
-> do _ <- Codec.pokeFileDecls decls pBuf
h <- System.openBinaryFile pathDst System.WriteMode
System.hPutBuf h pBuf len
System.hClose h
return ()
-- | Decode binary store to text shimmer file.
| System.takeExtension pathSrc == ".sms"
, System.takeExtension pathDst == ".smr"
= do decls <- Driver.runLoadFileDecls pathSrc
TL.writeFile pathDst
$ BL.toLazyText
$ mconcat
$ [ Source.buildDecl d <> BL.fromString "\n" | d <- decls]
| otherwise
= error "runConvert: cannot convert"