idris-0.99.1: main/Main.hs
module Main where
import System.Exit (ExitCode(..), exitSuccess, exitWith)
import Control.Monad (unless, when, (>=>))
import Data.Foldable (foldrM)
import Data.Maybe (fromMaybe)
import Idris.AbsSyntax
import Idris.CmdOptions
import Idris.Error
import Idris.Info.Show
import Idris.Main
import Idris.Package
import Util.System (setupBundledCC)
import System.Exit (ExitCode(..), exitWith)
import Util.System (setupBundledCC)
processShowOptions :: [Opt] -> Idris ()
processShowOptions opts = runIO $ do
when (ShowAll `elem` opts) $ showExitIdrisInfo
when (ShowLoggingCats `elem` opts) $ showExitIdrisLoggingCategories
when (ShowIncs `elem` opts) $ showExitIdrisFlagsInc
when (ShowLibs `elem` opts) $ showExitIdrisFlagsLibs
when (ShowLibDir `elem` opts) $ showExitIdrisLibDir
when (ShowDocDir `elem` opts) $ showExitIdrisDocDir
when (ShowPkgs `elem` opts) $ showExitIdrisInstalledPackages
check :: [Opt] -> (Opt -> Maybe a) -> ([a] -> Idris ()) -> Idris ()
check opts extractOpts action = do
case opt extractOpts opts of
[] -> return ()
fs -> do action fs
runIO exitSuccess
processClientOptions :: [Opt] -> Idris ()
processClientOptions opts = check opts getClient $ \fs -> case fs of
[] -> ifail "No --client argument. This indicates a bug. Please report."
(c : _) -> do
setVerbose 0
setQuiet True
case getPort opts of
Just DontListen -> ifail "\"--client\" and \"--port none\" are incompatible"
Just (ListenPort port) -> runIO $ runClient (Just port) c
Nothing -> runIO $ runClient Nothing c
processPackageOptions :: [Opt] -> Idris ()
processPackageOptions opts = do
check opts getPkgCheck $ \fs -> runIO $ do
mapM_ (checkPkg opts (WarnOnly `elem` opts) True) fs
check opts getPkgClean $ \fs -> runIO $ do
mapM_ (cleanPkg opts) fs
check opts getPkgMkDoc $ \fs -> runIO $ do
mapM_ (documentPkg opts) fs
check opts getPkgTest $ \fs -> runIO $ do
codes <- mapM (testPkg opts) fs
-- check if any of the tests exited with an exit code other
-- than zero; if they did, exit with exit code 1
unless (null $ filter (/= ExitSuccess) codes) $
exitWith (ExitFailure 1)
check opts getPkg $ \fs -> runIO $ do
mapM_ (buildPkg opts (WarnOnly `elem` opts)) fs
check opts getPkgREPL $ \fs -> case fs of
[f] -> replPkg opts f
_ -> ifail "Too many packages"
-- | The main function for the Idris executable.
runIdris :: [Opt] -> Idris ()
runIdris opts = do
runIO setupBundledCC
processShowOptions opts -- Show information then quit.
processClientOptions opts -- Be a client to a REPL server.
processPackageOptions opts -- Work with Idris packages.
idrisMain opts -- Launch REPL or compile mode.
-- Main program reads command line options, parses the main program, and gets
-- on with the REPL.
main :: IO ()
main = do
opts <- runArgParser
runMain (runIdris opts)