92 lines
2.1 KiB
Haskell
92 lines
2.1 KiB
Haskell
{-# LANGUAGE ApplicativeDo #-}
|
|
{-# LANGUAGE RecordWildCards #-}
|
|
module Gyehoek.Options
|
|
( Options(..)
|
|
, parser
|
|
, Runtime(..)
|
|
, Language(..)
|
|
)
|
|
where
|
|
|
|
import Options.Applicative
|
|
import Data.Foldable
|
|
import Gyehoek.Prelude hiding (argument)
|
|
|
|
|
|
data Runtime = Stackify | Wasm | CPS
|
|
deriving (Show, Generic, Eq)
|
|
|
|
data Language
|
|
= LanguageScheme
|
|
| LanguageCPS
|
|
| LanguageClosed
|
|
| LanguageStackified
|
|
| LanguageWasm
|
|
deriving (Show, Generic, Eq)
|
|
|
|
data Options = MkOptions
|
|
{ dumpClosed :: Bool
|
|
, dumpCPS :: Bool
|
|
, dumpParsed :: Bool
|
|
, dumpStackified :: Bool
|
|
, runtime :: Maybe Runtime
|
|
, inspectWasm :: Bool
|
|
, output :: FilePath
|
|
, sourceFile :: FilePath
|
|
, sourceLanguage :: Language
|
|
}
|
|
deriving (Show, Generic)
|
|
|
|
languageValues = ["scheme","cps","closed","stackified","wasm"]
|
|
languageReader = maybeReader \case
|
|
"scheme" -> Just LanguageScheme
|
|
"cps" -> Just LanguageCPS
|
|
"closed" -> Just LanguageClosed
|
|
"stackified" -> Just LanguageStackified
|
|
"wasm" -> Just LanguageWasm
|
|
_ -> Nothing
|
|
|
|
runtimeValues = ["stackify","wasm","cps","none"]
|
|
runtimeReader = maybeReader \case
|
|
"stackify" -> Just (Just Stackify)
|
|
"wasm" -> Just (Just Wasm)
|
|
"cps" -> Just (Just CPS)
|
|
"none" -> Just Nothing
|
|
_ -> Nothing
|
|
|
|
parser :: Parser Options
|
|
parser = do
|
|
dumpClosed <- switch (long "dump-closed")
|
|
dumpCPS <- switch (long "dump-cps")
|
|
dumpStackified <- switch (long "dump-stackified")
|
|
dumpParsed <- switch (long "dump-parsed")
|
|
inspectWasm <- switch $ long "inspect-wasm" <> short 'p'
|
|
runtime <- option runtimeReader . fold $
|
|
[ long "runtime"
|
|
, short 'R'
|
|
, value (Just Stackify)
|
|
, completeWith runtimeValues
|
|
, showDefaultWith $ const "stackify"
|
|
, metavar "RUNTIME"
|
|
]
|
|
sourceLanguage <- option languageReader . fold $
|
|
[ long "source"
|
|
, short 'S'
|
|
, value LanguageScheme
|
|
, completeWith languageValues
|
|
, showDefaultWith $ const "scheme"
|
|
, metavar "LANGUAGE"
|
|
]
|
|
output <- strOption . fold $
|
|
[ long "output"
|
|
, short 'o'
|
|
, metavar "FILE"
|
|
, value "-"
|
|
, action "file"
|
|
]
|
|
sourceFile <- argument str . fold $
|
|
[ metavar "FILE"
|
|
, action "file"
|
|
]
|
|
pure $ MkOptions {..}
|