blob: d2ac1e475b627215661e1fe52c3cb2725a9d4691 (
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
53
54
55
56
57
58
59
60
61
62
63
64
|
{-# 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"
)
|