dhall-haskell/dhall-lsp-server/app/Main.hs

84 lines
2.3 KiB
Haskell

{-| This module contains the top-level entrypoint and options parsing for the
@dhall-lsp-server@ executable
-}
module Main
( main
)
where
import Options.Applicative (Parser, ParserInfo)
import qualified Options.Applicative
import Control.Applicative ((<|>))
import Data.Monoid ((<>))
import qualified Data.Version
import qualified Dhall.LSP.Server
import qualified Paths_dhall_lsp_server
import qualified GHC.IO.Encoding
-- | Top-level program options
data Options = Options {
command :: Mode
, logFile :: Maybe FilePath
, version :: Bool
}
-- | The mode in which to run @dhall-lsp-server@
data Mode = Version | LSPServer
parseOptions :: Parser Options
parseOptions =
Options <$> parseMode <*> Options.Applicative.optional parseLogFile <*> parseVersion
where
parseLogFile = Options.Applicative.strOption
(Options.Applicative.long "log" <> Options.Applicative.help
"If present writes debug output to the specified file"
)
parseVersion = Options.Applicative.switch
( Options.Applicative.long "version"
<> Options.Applicative.help "Display version"
)
subcommand :: String -> String -> Parser a -> Parser a
subcommand name description parser = Options.Applicative.hsubparser
(Options.Applicative.command name parserInfo
<> Options.Applicative.metavar name
)
where
parserInfo = Options.Applicative.info
parser
(Options.Applicative.fullDesc <> Options.Applicative.progDesc description)
parseMode :: Parser Mode
parseMode =
subcommand "version" "Display version" (pure Version) <|> pure LSPServer
parserInfoOptions :: ParserInfo Options
parserInfoOptions = Options.Applicative.info
(Options.Applicative.helper <*> parseOptions)
(Options.Applicative.progDesc "LSP server for the Dhall language"
<> Options.Applicative.fullDesc
)
runCommand :: Options -> IO ()
runCommand Options {..} = do
if version
then printVersion
else case command of
Version -> printVersion
LSPServer -> Dhall.LSP.Server.run logFile
where
printVersion = putStrLn (Data.Version.showVersion Paths_dhall_lsp_server.version)
-- | Entry point for the @dhall-lsp-server@ executable
main :: IO ()
main = do
GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8
options <- Options.Applicative.execParser parserInfoOptions
runCommand options