module Hix.Managed.ProjectContext where

import Control.Monad.Trans.Reader (ask)

import qualified Hix.Data.Monad
import Hix.Data.Monad (AppResources (AppResources), M (M))
import qualified Hix.Data.Options
import Hix.Data.Options (ProjectOptions)
import Hix.Managed.BuildOutput (buildOutput, outputResult)
import qualified Hix.Managed.Data.BuildConfig
import Hix.Managed.Data.BuildConfig (BuildConfig)
import Hix.Managed.Data.ProjectContext (ProjectContext)
import Hix.Managed.Data.ProjectContextProto (ProjectContextProto)
import qualified Hix.Managed.Data.ProjectResult
import Hix.Managed.Data.ProjectResult (ProjectResult)
import qualified Hix.Managed.Handlers.Build
import Hix.Managed.Handlers.Build (BuildHandlers)
import qualified Hix.Managed.Handlers.Report
import qualified Hix.Managed.ProjectContextProto as ProjectContextProto
import Hix.Managed.StateFile (writeProjectState)

updateProject ::
  BuildHandlers ->
  BuildConfig ->
  ProjectResult ->
  M ()
updateProject :: BuildHandlers -> BuildConfig -> ProjectResult -> M ()
updateProject BuildHandlers
handlers BuildConfig
buildConf ProjectResult
results = do
  Bool -> M () -> M ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless BuildConfig
buildConf.validate do
    StateFileHandlers -> ProjectState -> M ()
writeProjectState BuildHandlers
handlers.stateFile ProjectResult
results.state
  BuildHandlers
handlers.report.mutations ProjectResult
results

processBuildResults ::
  BuildHandlers ->
  BuildConfig ->
  ProjectResult ->
  M ()
processBuildResults :: BuildHandlers -> BuildConfig -> ProjectResult -> M ()
processBuildResults BuildHandlers
handlers BuildConfig
buildConf ProjectResult
results = do
  BuildHandlers -> BuildConfig -> ProjectResult -> M ()
updateProject BuildHandlers
handlers BuildConfig
buildConf ProjectResult
results
  AppResources {$sel:output:AppResources :: AppResources -> OutputFormat
output = OutputFormat
format, OutputTarget
target :: OutputTarget
$sel:target:AppResources :: AppResources -> OutputTarget
target} <- ReaderT AppResources (ExceptT Error IO) AppResources
-> M AppResources
forall a. ReaderT AppResources (ExceptT Error IO) a -> M a
M ReaderT AppResources (ExceptT Error IO) AppResources
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
  BuildOutput -> OutputTarget -> OutputFormat -> M ()
outputResult (ProjectResult -> BuildOutput
buildOutput ProjectResult
results) OutputTarget
target OutputFormat
format

withProjectContext ::
  BuildHandlers ->
  ProjectOptions ->
  ProjectContextProto ->
  (ProjectContext -> M ProjectResult) ->
  M ()
withProjectContext :: BuildHandlers
-> ProjectOptions
-> ProjectContextProto
-> (ProjectContext -> M ProjectResult)
-> M ()
withProjectContext BuildHandlers
handlers ProjectOptions
opts ProjectContextProto
proto ProjectContext -> M ProjectResult
use = do
  ProjectContext
project <- ProjectOptions -> ProjectContextProto -> M ProjectContext
ProjectContextProto.validate ProjectOptions
opts ProjectContextProto
proto
  ProjectResult
result <- ProjectContext -> M ProjectResult
use ProjectContext
project
  BuildHandlers -> BuildConfig -> ProjectResult -> M ()
processBuildResults BuildHandlers
handlers ProjectOptions
opts.build ProjectResult
result