packages feed

hix-0.7.0: lib/Hix/Managed/ProjectContext.hs

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 handlers buildConf results = do
  unless buildConf.validate do
    writeProjectState handlers.stateFile results.state
  handlers.report.mutations results

processBuildResults ::
  BuildHandlers ->
  BuildConfig ->
  ProjectResult ->
  M ()
processBuildResults handlers buildConf results = do
  updateProject handlers buildConf results
  AppResources {output = format, target} <- M ask
  outputResult (buildOutput results) target format

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