-- hsdip -- a diplomacy parser/renderer. -- Copyright (C) 2006 Evan Martin module Main(main) where import Data.List import System.IO import System.Environment import System.Exit import Text.ParserCombinators.Parsec.Pos (SourceName) import Conf -- import Diplomacy import JudgeParser import qualified Render die :: String -> IO a die str = do putStrLn str; exitFailure; error "notreached" okOrDie :: IO (Either String a) -> IO a okOrDie cmd = cmd >>= either die return data SubCommand = SubCommand { cmdName :: String, cmdHelp :: String, cmdRun :: [String] -> IO () } instance Show SubCommand where show s = cmdName s subcommands :: [SubCommand] subcommands = [ SubCommand "parse" "rulesfile" doParse, SubCommand "render" "rulesfile output.png" doRender ] doParse :: [Text.ParserCombinators.Parsec.Pos.SourceName] -> IO () doParse args = do infile <- case args of [x] -> return x _ -> die "parse expects on argument" turn <- okOrDie $ JudgeParser.parseFileTurns infile print turn doRender :: [Text.ParserCombinators.Parsec.Pos.SourceName] -> IO () doRender args = do conf <- okOrDie $ Conf.parseFile "data/conf" (infile, outfile) <- case args of [x,y] -> return (x,y) _ -> die "render expects two arguments" turn <- okOrDie $ JudgeParser.parseFileTurn infile print turn Render.renderTurnToFile conf turn outfile usage :: String usage = "usage: render mode [modeargs]\n" ++ "modes are:\n" ++ concatMap (\sc -> " " ++ cmdName sc ++ " " ++ cmdHelp sc ++ "\n") subcommands main :: IO () main = do args <- getArgs (mode, ags) <- case args of (m:a) -> return (m, a) _ -> die usage command <- case find (\s -> cmdName s == mode) subcommands of Just c -> return c Nothing -> die usage cmdRun command ags -- vim: set ts=2 sw=2 et :