packages feed

agda-language-server-0.0.3.0: app/Main.hs

module Main where

import Server (run)
import System.Console.GetOpt
import System.Environment (getArgs)
import Text.Read (readMaybe)

main :: IO ()
main = do
  (opts, _) <- getArgs >>= parseOpts
  if optHelp opts 
    then putStrLn $ usageInfo usage options
    else do 
      _ <- run (optViaTCP opts)
      return ()

--------------------------------------------------------------------------------

-- | Command-line arguments
data Options = Options
  { optViaTCP :: Maybe Int,
    optHelp :: Bool
  }

defaultOptions :: Options
defaultOptions = Options {optViaTCP = Nothing, optHelp = False}

options :: [OptDescr (Options -> Options)]
options =
  [ Option
      ['h']
      ["help"]
      (NoArg (\opts -> opts {optHelp = True}))
      "print this help message",
   Option 
      ['p']
      ["port"]
      (OptArg (\port opts -> case port of 
                  Just n  -> opts {optViaTCP = readMaybe n}
                  Nothing -> opts {optViaTCP = Just 4096}) "PORT")
      "talk with the editor via TCP port (4096 as default)"
  ]

usage :: String
usage = "Agda Language Server v0.0.3.0 \nUsage: als [Options...]\n"

parseOpts :: [String] -> IO (Options, [String])
parseOpts argv = case getOpt Permute options argv of
  (o, n, []) -> return (foldl (flip id) defaultOptions o, n)
  (_, _, errs) -> ioError $ userError $ concat errs ++ usageInfo usage options