packages feed

language-lustre-1.0.0: exe/Options.hs

module Options where

import SimpleGetOpt
import Data.Set(Set)
import qualified Data.Set as Set

import Language.Lustre.Phase

data Options = Options
  { progFile  :: Maybe FilePath
  , inputFile :: Maybe FilePath
  , logFile   :: Maybe FilePath
  , dumpAfter :: Set LustrePhase
  , dumpState :: Bool
  , showHelp  :: Bool
  }

defaultOptions :: Options
defaultOptions = Options
  { progFile    = Nothing
  , inputFile   = Nothing
  , logFile     = Nothing
  , dumpAfter   = noPhases
  , dumpState   = False
  , showHelp    = False
  }

options :: OptSpec Options
options = OptSpec
  { progDefaults = defaultOptions
  , progOptions =

      [ Option [] ["input"]
        "Read inputs from this file (default `stdin`)."
        $ ReqArg "FILE" $ \a s ->
            case inputFile s of
              Nothing -> Right s { inputFile = Just a }
              Just _  -> Left "Multiple input files."

      , Option [] ["logFile"]
        "Write messages to his file (default `stdout`)."
        $ ReqArg "FILE" $ \a s ->
            case logFile s of
              Nothing -> Right s { logFile = Just a }
              Just _  -> Left "Multiple log file."

      , Option [] ["dump-all"]
        "Dump AST after each phase."
        $ NoArg $ \s -> Right s { dumpAfter = allPhases }

      , dumpOpt PhaseRename    "renamed"     "renaming"
      , dumpOpt PhaseTypecheck "typechecked" "type checking"
      , dumpOpt PhaseNoStatic  "no-static"   "elimininating constants"
      , dumpOpt PhaseNoStruct  "no-struct"   "elimininating strucutred data"
      , dumpOpt PhaseInline    "inlined"     "inlining nodes"
      , dumpOpt PhaseToCore    "core"        "translating to core"

      , Option [] ["dump-state"]
        "Dump state before each step."
        $ NoArg $ \s -> Right s { dumpState = True }

      , Option [] ["help"]
        "Show this helps message."
        $ NoArg $ \s -> Right s { showHelp = True }

      ]

  , progParamDocs = [("FILE", "Lustre file containing model (required).")]
  , progParams = \a s -> case progFile s of
                           Nothing -> Right s { progFile = Just a }
                           _ -> Left "Multiple program files."
  }

  where
  dumpOpt ph o msg =
    Option [] ["dump-" ++ o]
    ("Dump AST after " ++  msg ++ ".")
    $ NoArg $ \s -> Right s { dumpAfter = Set.insert ph (dumpAfter s) }