packages feed

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

module Hix.Managed.StateFile where

import qualified Data.Map.Strict as Map
import Exon (exon)
import Path (Abs, Dir, Path)

import Hix.Class.EncodeNix (encodeNix)
import Hix.Data.Monad (M)
import Hix.Data.NixExpr (Expr (..), ExprAttr (..))
import Hix.Data.Overrides (Overrides)
import qualified Hix.Log as Log
import Hix.Managed.Data.EnvContext (EnvContext)
import qualified Hix.Managed.Data.EnvState
import Hix.Managed.Data.EnvState (EnvState)
import Hix.Managed.Data.Initial (Initial (Initial))
import Hix.Managed.Data.ProjectState (ProjectState)
import qualified Hix.Managed.Handlers.StateFile
import Hix.Managed.Handlers.StateFile (StateFileHandlers)
import Hix.Managed.UpdateState (envStateForBuild)
import Hix.NixExpr (renderRootExpr)

renderMap ::
  Coercible k Text =>
  (v -> Expr) ->
  Map k v ->
  Expr
renderMap v =
  ExprAttrs . fmap (uncurry ExprAttr . bimap coerce v) . Map.toList

renderManaged' :: ProjectState -> Expr
renderManaged' =
  encodeNix

writeStateFile ::
  Text ->
  StateFileHandlers ->
  Maybe (Path Abs Dir) ->
  ProjectState ->
  M ()
writeStateFile purpose handlers tmpRoot state = do
  Log.debug [exon|writing managed stated file for #{purpose}: #{renderRootExpr expr}|]
  handlers.writeFile tmpRoot expr
  where
    expr = encodeNix state

writeProjectState ::
  StateFileHandlers ->
  ProjectState ->
  M ()
writeProjectState handlers newState =
  writeStateFile "final result persistence" handlers Nothing newState

writeBuildStateFor ::
  Text ->
  StateFileHandlers ->
  Path Abs Dir ->
  EnvContext ->
  Overrides ->
  M ()
writeBuildStateFor purpose handlers tmpRoot context overrides =
  writeStateFile purpose handlers (Just tmpRoot) (envStateForBuild context overrides)

writeInitialEnvState ::
  StateFileHandlers ->
  Path Abs Dir ->
  EnvContext ->
  Initial EnvState ->
  M ()
writeInitialEnvState handlers tmpRoot context (Initial state) =
  writeBuildStateFor "env initialization" handlers tmpRoot context state.overrides