module Hix where

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 :: forall (m :: * -> *). MonadIO m => GlobalOptions -> Error -> m ()
handleError GlobalOptions {Bool
verbose :: Bool
$sel:verbose:GlobalOptions :: GlobalOptions -> Bool
verbose} = \case
  PreprocError Text
err -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
printPreprocError Text
err
  EnvError Text
err -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
printEnvError Text
err
  GhciError Text
err -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
printGhciError Text
err
  NewError Text
err -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
printNewError Text
err
  BootstrapError Text
err -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
printBootstrapError Text
err
  NoMatch Text
msg | Bool
verbose -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
printPreprocError Text
msg
  NoMatch Text
_ -> m ()
forall (f :: * -> *). Applicative f => f ()
unit
  Fatal Text
err -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
printFatalError Text
err
  Client Text
err -> Text -> m ()
forall (m :: * -> *). MonadIO m => Text -> m ()
Console.err (Text -> Text
errorMessage Text
err)

runCommand :: Command -> M ()
runCommand :: Command -> M ()
runCommand = \case
  Preproc PreprocOptions
opts -> PreprocOptions -> M ()
preprocess PreprocOptions
opts
  EnvRunner EnvRunnerCommandOptions
opts -> EnvRunnerOptions -> M ()
printEnvRunner EnvRunnerCommandOptions
opts.options
  GhcidCmd GhcidOptions
opts -> GhcidOptions -> M ()
printGhcidCmdline GhcidOptions
opts
  GhciCmd GhciOptions
opts -> GhciOptions -> M ()
printGhciCmdline GhciOptions
opts
  NewCmd NewOptions
opts -> NewProjectConfig -> M ()
newProject NewOptions
opts.config
  BootstrapCmd BootstrapOptions
opts -> BootstrapProjectConfig -> M ()
bootstrapProject BootstrapOptions
opts.config
  BumpCmd BumpOptions
opts -> BumpOptions -> M ()
bumpCli BumpOptions
opts
  LowerCmd LowerCommand
sub -> case LowerCommand
sub of
    LowerInitCmd LowerOptions
opts -> LowerOptions -> M ()
lowerInitCli LowerOptions
opts
    LowerOptimizeCmd LowerOptions
opts -> LowerOptions -> M ()
lowerOptimizeCli LowerOptions
opts
    LowerStabilizeCmd LowerOptions
opts -> LowerOptions -> M ()
lowerStabilizeCli LowerOptions
opts
    LowerAutoCmd LowerOptions
opts -> LowerOptions -> M ()
lowerAutoCli LowerOptions
opts

main :: IO ()
main :: IO ()
main = do
  Options GlobalOptions
global Command
cmd <- IO Options
parseCli
  (Error -> IO ()) -> Either Error () -> IO ()
forall (m :: * -> *) a b.
Applicative m =>
(a -> m b) -> Either a b -> m b
leftA (Bool -> Error -> IO ()
forall (m :: * -> *). MonadIO m => Bool -> Error -> m ()
printError GlobalOptions
global.verbose) (Either Error () -> IO ()) -> IO (Either Error ()) -> IO ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< GlobalOptions -> M () -> IO (Either Error ())
forall a. GlobalOptions -> M a -> IO (Either Error a)
runMWith GlobalOptions
global (Command -> M ()
runCommand Command
cmd)