wasm-ifc/app/Main.hs

42 lines
1.2 KiB
Haskell
Raw Normal View History

2024-10-24 17:45:05 +02:00
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 <module-name> # Validate and execute the specified MiniWasm module\n\
\\n\
\Available modules:\n"
++ unlines (fmap (" " ++) $ fmap fst testPrograms)