From 2a20afb971ef3323955964b1bbb5f75af4ca5fcb Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Sat, 1 Nov 2025 17:45:25 +0100 Subject: Add server capability --- lambda-calcul/haskell/app/Main.hs | 62 +++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 6 deletions(-) (limited to 'lambda-calcul/haskell/app') 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 -- cgit v1.3.1