module Main where import System.Environment(getArgs) import System.Exit(exitFailure) import MiniWasm.Syntax import MiniWasm.Validation import MiniWasm.Execution import MiniWasm.TestCases.Programs printError :: String -> IO a printError err = do putStrLn err exitFailure validateAndExecute :: Module -> IO () validateAndExecute m = case validateModule m of Left e -> printError $ "Validation error: " ++ e Right () -> do let cfg = executeModule m case executeModule m of Config{instrs = []} -> print cfg.stack Config{instrs = [Trapping reason]} -> printError $ "Program trapped with " ++ show reason _ -> printError "Program didn't reach final state" -- This shouldn't happen unless you modify 'stepUntilFinal' or 'executeModule' main :: IO () main = do args <- getArgs case args of [m] -> case lookup m testPrograms of Nothing -> printError "Unknown module name" Just (m, _) -> validateAndExecute m _ -> do printError $ "Usage:\n\ \ miniwasm # Validate and execute the specified MiniWasm module\n\ \\n\ \Available modules:\n" ++ unlines (fmap (" " ++) $ fmap fst testPrograms)