84 lines
2.3 KiB
Haskell
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
|