mima-tools/mima-run/Main.hs

43 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) $ \e -> do
liftIO $ putStrLn $ "Metafile could not be loaded: " ++ T.unpack e
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