summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/app/Main.hs
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