{-# 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 {..}