summaryrefslogtreecommitdiff
path: root/Biz/Language/Bs/Cli.hs
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"
        )