packages feed

hix-0.8.0: lib/Hix.hs

module Hix where

import System.Exit (exitFailure)

import Hix.Bootstrap (bootstrapProject)
import qualified Hix.Console as Console
import Hix.Console (errorMessage)
import qualified Hix.Data.GlobalOptions
import Hix.Data.GlobalOptions (GlobalOptions (GlobalOptions))
import qualified Hix.Data.Options as Options
import Hix.Data.Options (
  Command (..),
  LowerCommand (LowerAutoCmd, LowerInitCmd, LowerOptimizeCmd, LowerStabilizeCmd),
  Options (Options),
  )
import Hix.Env (printEnvRunner)
import Hix.Error (
  Error (..),
  printBootstrapError,
  printEnvError,
  printError,
  printFatalError,
  printGhciError,
  printNewError,
  printPreprocError,
  )
import Hix.Ghci (printGhciCmdline, printGhcidCmdline)
import Hix.Managed.Bump.App (bumpCli)
import Hix.Managed.Lower.App (lowerAutoCli, lowerInitCli, lowerOptimizeCli, lowerStabilizeCli)
import Hix.Monad (M, runMWith)
import Hix.New (newProject)
import Hix.Options (parseCli)
import Hix.Preproc (preprocess)

handleError ::
  MonadIO m =>
  GlobalOptions ->
  Error ->
  m ()
handleError GlobalOptions {verbose} = \case
  PreprocError err -> printPreprocError err
  EnvError err -> printEnvError err
  GhciError err -> printGhciError err
  NewError err -> printNewError err
  BootstrapError err -> printBootstrapError err
  NoMatch msg | verbose -> printPreprocError msg
  NoMatch _ -> unit
  Fatal err -> printFatalError err
  Client err -> Console.err (errorMessage err)

runCommand :: Command -> M ()
runCommand = \case
  Preproc opts -> preprocess opts
  EnvRunner opts -> printEnvRunner opts.options
  GhcidCmd opts -> printGhcidCmdline opts
  GhciCmd opts -> printGhciCmdline opts
  NewCmd opts -> newProject opts.config
  BootstrapCmd opts -> bootstrapProject opts.config
  BumpCmd opts -> bumpCli opts
  LowerCmd sub -> case sub of
    LowerInitCmd opts -> lowerInitCli opts
    LowerOptimizeCmd opts -> lowerOptimizeCli opts
    LowerStabilizeCmd opts -> lowerStabilizeCli opts
    LowerAutoCmd opts -> lowerAutoCli opts

failure :: Bool -> Error -> IO ()
failure verbose err = do
  printError verbose err
  exitFailure

main :: IO ()
main = do
  Options global cmd <- parseCli
  leftA (failure global.verbose) =<< runMWith global (runCommand cmd)