module Hix.Managed.Lower.App where

import Hix.Data.Error (Error (Client))
import Hix.Data.Monad (M)
import qualified Hix.Data.Options
import Hix.Data.Options (LowerOptions (LowerOptions))
import Hix.Json (jsonConfigE)
import Hix.Managed.Data.LowerConfig (LowerConfig, lowerConfig)
import Hix.Managed.Data.ProjectContext (ProjectContext)
import qualified Hix.Managed.Data.ProjectContextProto
import Hix.Managed.Data.ProjectResult (ProjectResult)
import Hix.Managed.Handlers.Build (BuildHandlers)
import Hix.Managed.Handlers.Build.Test (chooseHandlers)
import Hix.Managed.Lower.Auto (lowerAutoMain)
import Hix.Managed.Lower.Init (lowerInitMain)
import Hix.Managed.Lower.Optimize (lowerOptimizeMain)
import Hix.Managed.Lower.Stabilize (lowerStabilizeMain)
import Hix.Managed.ProjectContext (withProjectContext)

lowerCli ::
  (LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult) ->
  LowerOptions ->
  M ()
lowerCli :: (LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult)
-> LowerOptions -> M ()
lowerCli LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult
main opts :: LowerOptions
opts@LowerOptions {ManagedOptions
common :: ManagedOptions
common :: LowerOptions -> ManagedOptions
common} = do
  ProjectContextProto
context <- (Text -> Error)
-> Either ProjectContextProto JsonConfig -> M ProjectContextProto
forall a.
FromJSON a =>
(Text -> Error) -> Either a JsonConfig -> M a
jsonConfigE Text -> Error
Client ManagedOptions
common.context
  BuildHandlers
handlers <- StateFileConfig
-> Envs EnvConfig
-> Maybe BuildOutputsPrefix
-> BuildConfig
-> CabalConfig
-> Maybe SpecialBuildHandlers
-> M BuildHandlers
forall (m :: * -> *).
MonadIO m =>
StateFileConfig
-> Envs EnvConfig
-> Maybe BuildOutputsPrefix
-> BuildConfig
-> CabalConfig
-> Maybe SpecialBuildHandlers
-> m BuildHandlers
chooseHandlers ManagedOptions
common.stateFile ProjectContextProto
context.envs ProjectContextProto
context.buildOutputsPrefix ManagedOptions
common.project.build ManagedOptions
common.cabal
    ManagedOptions
common.handlers
  BuildHandlers
-> ProjectOptions
-> ProjectContextProto
-> (ProjectContext -> M ProjectResult)
-> M ()
withProjectContext BuildHandlers
handlers ManagedOptions
common.project ProjectContextProto
context (LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult
main LowerConfig
conf BuildHandlers
handlers)
  where
    conf :: LowerConfig
conf = LowerOptions -> LowerConfig
lowerConfig LowerOptions
opts

lowerInitCli :: LowerOptions -> M ()
lowerInitCli :: LowerOptions -> M ()
lowerInitCli = (LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult)
-> LowerOptions -> M ()
lowerCli LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult
lowerInitMain

lowerOptimizeCli :: LowerOptions -> M ()
lowerOptimizeCli :: LowerOptions -> M ()
lowerOptimizeCli = (LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult)
-> LowerOptions -> M ()
lowerCli ((BuildHandlers -> ProjectContext -> M ProjectResult)
-> LowerConfig
-> BuildHandlers
-> ProjectContext
-> M ProjectResult
forall a b. a -> b -> a
const BuildHandlers -> ProjectContext -> M ProjectResult
lowerOptimizeMain)

lowerStabilizeCli :: LowerOptions -> M ()
lowerStabilizeCli :: LowerOptions -> M ()
lowerStabilizeCli = (LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult)
-> LowerOptions -> M ()
lowerCli ((BuildHandlers -> ProjectContext -> M ProjectResult)
-> LowerConfig
-> BuildHandlers
-> ProjectContext
-> M ProjectResult
forall a b. a -> b -> a
const BuildHandlers -> ProjectContext -> M ProjectResult
lowerStabilizeMain)

lowerAutoCli :: LowerOptions -> M ()
lowerAutoCli :: LowerOptions -> M ()
lowerAutoCli = (LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult)
-> LowerOptions -> M ()
lowerCli LowerConfig -> BuildHandlers -> ProjectContext -> M ProjectResult
lowerAutoMain