blob: 769d2f06af3d5c64dd6c16c49a362a0ee5f43950 (
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
|
import Minilang.IO (runEval)
import Minilang.REPL (withTerminal)
import Minilang.Server (startServer, waitServer)
import Options.Applicative
import System.IO (stdin, stdout)
import System.Posix.IO (stdInput)
import System.Posix.Terminal (queryTerminal)
data RunMode
= Local
| Server
deriving (Eq, Show)
data Options = Options
{ serverPort :: Int,
runMode :: RunMode
}
deriving (Eq, Show)
optionsParser :: ParserInfo Options
optionsParser =
info
(helper <*> minilangOptions)
( header "Minilang"
<> fullDesc
)
minilangOptions :: Parser Options
minilangOptions =
Options <$> portOption <*> runModeOption
portOption :: Parser Int
portOption =
option
auto
( long "port"
<> short 'p'
<> value 7890
<> metavar "INT"
<> help "port to listent on (default: 7890)"
)
runModeOption :: Parser RunMode
runModeOption =
flag
Local
Server
( long "server"
<> short 'S'
<> help "run in server mode, listening for client REPLs over HTTP"
)
main :: IO ()
main = do
Options {..} <- execParser optionsParser
case runMode of
Local -> do
hasTty <- queryTerminal stdInput
if hasTty
then withTerminal
else runEval stdin stdout
Server -> startServer serverPort >>= waitServer
|