content: -- | @futhark check@
  module Futhark.CLI.Check (main) where
  
  import Control.Monad
  import Control.Monad.IO.Class
  import Futhark.Compiler
  import Futhark.Util.Options
  import Futhark.Util.Pretty (hPutDoc)
  import Language.Futhark.Warnings
  import System.Exit
  import System.IO
  
  data CheckConfig = CheckConfig {checkWarn :: Bool, checkWerror :: Bool}
  
  newCheckConfig :: CheckConfig
  newCheckConfig = CheckConfig True False
  
  options :: [FunOptDescr CheckConfig]
  options =
    [ Option
        "w"
        []
        (NoArg $ Right $ \cfg -> cfg {checkWarn = False})
        "Disable all warnings.",
      Option
        []
        ["Werror"]
        (NoArg $ Right $ \cfg -> cfg {checkWerror = True})
        "Treat warnings as errors."
    ]
  
  -- | Run @futhark check@.
  main :: String -> [String] -> IO ()
  main = mainWithOptions newCheckConfig options "program" $ \args cfg ->
    case args of
      [file] -> Just $ do
        (warnings, _, _) <- readProgramOrDie file
        when (checkWarn cfg && anyWarnings warnings) $ do
          liftIO $ hPutDoc stderr $ prettyWarnings warnings
          when (checkWerror cfg) $ do
            hPutStrLn stderr "\nTreating above warnings as errors due to --Werror."
            exitWith $ ExitFailure 2
      _ -> Nothing
  