42 lines
1.5 KiB
Haskell
42 lines
1.5 KiB
Haskell
module Main where
|
|
|
|
import Control.Monad.IO.Class
|
|
import qualified Data.Text as T
|
|
import qualified Data.Text.IO as T
|
|
import Options.Applicative
|
|
|
|
import Mima.Format
|
|
import Mima.MimaRun.Options
|
|
import Mima.Run
|
|
import Mima.Vm.Flags
|
|
import Mima.Vm.Metadata
|
|
import Mima.Vm.State
|
|
import Mima.Vm.Storage
|
|
|
|
loadMetadataOrEmpty :: FilePath -> Run Metadata
|
|
loadMetadataOrEmpty path = catch (loadMetadata path) (\error -> do
|
|
liftIO $ putStrLn $ "Metafile could not be loaded. " ++ T.unpack error
|
|
pure mempty)
|
|
|
|
main :: IO ()
|
|
main = runOrExit 2 $ do
|
|
opts <- liftIO $ execParser parserInfo
|
|
initialState <- loadMimaState $ inputFile opts
|
|
metadata <- loadMetadataOrEmpty $ metadataFile opts
|
|
let flags = flagsFromMetadata metadata
|
|
|
|
finalState <- liftIO $ case steps opts of
|
|
Nothing -> do
|
|
let (finalState, abortReason, stepsMade) = execute flags initialState
|
|
putStrLn $ "Stopped after " ++ show stepsMade ++ " steps, reason:"
|
|
T.putStrLn $ toText abortReason
|
|
pure finalState
|
|
Just n -> do
|
|
let (finalState, mAbortReason, stepsMade) = executeN n flags initialState
|
|
putStrLn $ "Stopped after " ++ show stepsMade ++ " steps, reason:"
|
|
case mAbortReason of
|
|
Nothing -> putStrLn "Ran out of steps"
|
|
Just abortReason -> T.putStrLn $ toText abortReason
|
|
pure finalState
|
|
liftIO $ putStrLn ""
|
|
liftIO $ print finalState
|