packages feed

ewe-0.1.0.12: src/Main.hs

module Main where

import Paths_ewe (version)
import System.Environment(getArgs)
import System.IO(openFile, hClose, IOMode(..), hGetContents, stdin, stdout
                ,stderr, hPutStr, hPutStrLn)
import System.Exit(ExitCode(..),exitSuccess)
import Data.Version(Version(..), showVersion)
import System.Console.GetOpt
import Data.Maybe(fromMaybe)
import Language.EWE.Parser
import Language.EWE.AbsSyn
import Language.EWE.VM

data Flag = EweVersion deriving Show

options :: [OptDescr Flag]
options =
  [ Option ['V','?'] ["version"] (NoArg EweVersion) "show version number"
  ]

compilerOpts :: [String] -> IO ([Flag], [String])
compilerOpts argv =
  case getOpt Permute options argv of
    (o,n,[]) -> return (o,n)
    (_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
    where header = "Usage: ewe [OPTION...] files..."

processFile :: FilePath -> IO ()
processFile fp = do
  hPutStr stdout $ "Processing file: " ++ fp
  fh   <- openFile fp ReadMode
  s    <- hGetContents fh
  let pRes = pEWE s fp
  case pRes of
    Left err   -> hPutStrLn stderr $ " Parsing error at " ++ (show err)
    Right prog -> hPutStrLn stdout $ " is Ok"
  hClose fh

processFlags :: [Flag] -> IO ()
processFlags = mapM_ processFlag

processFlag :: Flag -> IO ()
processFlag EweVersion = (hPutStrLn stdout $ "ewe version: " ++ (showVersion version)) >> exitSuccess
                         
main :: IO ()
main = do
  (flgs, fls) <- (getArgs >>= compilerOpts)
  processFlags flgs
  mapM_ processFile fls