rattletrap-2.2.2: library/Rattletrap/Main.hs
module Rattletrap.Main where
import Rattletrap.Helper
import Rattletrap.Version
import qualified Data.ByteString.Lazy as ByteString
import qualified Data.Version as Version
import qualified System.Environment as Environment
-- | Gets command-line arguments and passes them to 'mainWithArgs'.
main :: IO ()
main = do
args <- Environment.getArgs
mainWithArgs args
-- | Runs the main command-line interface. Can be used in one of three modes:
--
-- 1. @mainWithArgs ["version"]@: Prints out the version number and exits.
-- Mostly useful for debugging.
-- 2. @mainWithArgs ["decode"]@: Parses a raw replay into JSON. By default
-- this reads from STDIN and writes to STDOUT. To read from a file, pass a
-- second argument like @mainWithArgs ["decode", "input.replay"]@. To write
-- to a file, pass a third argument like
-- @mainWithArgs ["decode", "input.replay", "output.json"]@.
-- 3. @mainWithArgs ["encode"]@: Generates a raw replay from JSON. The
-- handling of input and output is the same as decoding.
mainWithArgs :: [String] -> IO ()
mainWithArgs args =
case args of
["version"] -> putStrLn (Version.showVersion version)
action:files -> do
(getInput, putOutput) <- getIO files
input <- getInput
output <-
case action of
"decode" ->
case decodeReplay input of
Left message -> fail message
Right replay -> pure (encodeJson replay)
"encode" ->
case decodeJson input of
Left message -> fail message
Right replay -> pure (encodeReplay replay)
_ -> fail ("unknown action: " ++ show action)
putOutput output
_ -> fail ("unknown arguments: " ++ show args)
getIO :: [FilePath]
-> IO (IO ByteString.ByteString, ByteString.ByteString -> IO ())
getIO files =
case files of
[] -> pure (ByteString.getContents, ByteString.putStr)
[i] -> pure (ByteString.readFile i, ByteString.putStr)
[i, o] -> pure (ByteString.readFile i, ByteString.writeFile o)
_ -> fail ("unknown files: " ++ show files)