{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE NoImplicitPrelude #-} module Language.Bs.Cli ( run ) where import Data.String import Data.Text.IO as TIO import Language.Bs.Eval -- evalFile :: T.Text -> IO () import Language.Bs.Repl -- Repl.mainLoop :: IO () import Options.Applicative import Protolude import System.Directory -- SOURCES --http://book.realworldhaskell.org/read/io.html -- https://github.com/pcapriotti/optparse-applicative -- https://hackage.haskell.org/package/optparse-applicative runScript :: FilePath -> IO () runScript fname = do exists <- doesFileExist fname if exists then TIO.readFile fname >>= evalFile fname else TIO.putStrLn "File does not exist." data LineOpts = UseReplLineOpts | RunScriptLineOpts String parseLineOpts :: Parser LineOpts parseLineOpts = runScriptOpt <|> runReplOpt where runScriptOpt = RunScriptLineOpts <$> strOption (long "script" <> short 's' <> metavar "SCRIPT" <> help "File containing the script you want to run") runReplOpt = UseReplLineOpts <$ flag' () (long "repl" <> short 'r' <> help "Run as interavtive read/evaluate/print/loop") schemeEntryPoint :: LineOpts -> IO () schemeEntryPoint UseReplLineOpts = mainLoop --repl schemeEntryPoint (RunScriptLineOpts script) = runScript script run :: IO () run = execParser opts >>= schemeEntryPoint where opts = info (helper <*> parseLineOpts) ( fullDesc <> header "Executable binary for Write You A Scheme v2.0" <> progDesc "contains an entry point for both running scripts and repl" )