packages feed

hwm-0.5.0: src/HWM/CLI/Command/Sync.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE NoImplicitPrelude #-}

module HWM.CLI.Command.Sync (sync) where

import HWM.Core.Common (Name)
import HWM.Core.Formatting (Color (..), Format (..), Status (..), chalk)
import HWM.Core.Sync (SyncMode (..))
import HWM.Domain.ConfigT (ConfigT)
import HWM.Domain.Environments (BuildEnvironment (..), StackBuildConfig (..), TargetModes (..), getBuildEnvironment)
import HWM.Integrations.Toolchain.Cabal (syncCabalProject)
import HWM.Integrations.Toolchain.Hie (syncHie)
import HWM.Integrations.Toolchain.Nix (syncNixFile)
import HWM.Integrations.Toolchain.Package (syncPackagesByMode)
import HWM.Integrations.Toolchain.Stack (syncStackYaml)
import HWM.Runtime.Cache (Registry (..), updateRegistry)
import HWM.Runtime.UI (sectionConfig, sectionTableM)
import Relude

sync :: Maybe Name -> ConfigT ()
sync tag = do
  env <- getBuildEnvironment tag
  updateRegistry $ \reg -> reg {currentEnv = buildName env}
  sectionTableM
    "sync"
    [ ("environment", pure $ chalk Cyan $ format env),
      ("resolver", pure $ stackResolver (buildStack env))
    ]
  sectionConfig (syncTargets env)
  syncPackagesByMode (targetPackages $ buildTargets env)

syncTargets :: BuildEnvironment -> [(Text, ConfigT Status)]
syncTargets env =
  [ (label, action mode)
  | (mode, label, action) <- targets,
    mode /= SyncModeIgnore
  ]
  where
    modes = buildTargets env
    targets =
      [ (targetCabal modes, "cabal.project", syncCabalProject),
        (targetStack modes, "stack.yaml", syncStackYaml),
        (targetNix modes, "flake.nix", syncNixFile),
        (targetHie modes, "hie.yaml", syncHie)
      ]