blob: 4c48c86bf08a59951bc11cab24e47d97f96e5f2c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
{-# 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" )
|