summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/app/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/app/Main.hs')
-rw-r--r--lambda-calcul/haskell/app/Main.hs62
1 files changed, 56 insertions, 6 deletions
diff --git a/lambda-calcul/haskell/app/Main.hs b/lambda-calcul/haskell/app/Main.hs
index 0b40f60..769d2f0 100644
--- a/lambda-calcul/haskell/app/Main.hs
+++ b/lambda-calcul/haskell/app/Main.hs
@@ -1,12 +1,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)
-import System.Posix (stdInput)
-import Minilang.REPL (withTerminal)
+
+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
- hasTty <- queryTerminal stdInput
- if hasTty
- then withTerminal
- else runEval stdin stdout
+ Options {..} <- execParser optionsParser
+ case runMode of
+ Local -> do
+ hasTty <- queryTerminal stdInput
+ if hasTty
+ then withTerminal
+ else runEval stdin stdout
+ Server -> startServer serverPort >>= waitServer