packages feed

hwm-0.2.0: src/HWM/Integrations/Toolchain/Hie.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE NoImplicitPrelude #-}

module HWM.Integrations.Toolchain.Hie
  ( syncHie,
  )
where

import Data.Aeson (FromJSON (..), ToJSON (..), Value (..), object)
import HWM.Core.Common (Name)
import HWM.Core.Formatting (Format (format))
import HWM.Core.Options (Options (..), askOptions)
import HWM.Core.Pkg (Pkg (..), pkgFile)
import HWM.Domain.ConfigT (ConfigT)
import HWM.Domain.Workspace (allPackages)
import HWM.Integrations.Toolchain.Cabal (HasSourceDirs (..), readCabalPackage)
import HWM.Runtime.Files (rewrite_)
import Relude

data Component = Component
  { path :: FilePath,
    component :: Name
  }
  deriving
    ( ToJSON,
      FromJSON,
      Generic,
      Show
    )

data Components = Components
  { stackYaml :: FilePath,
    components :: [Component]
  }
  deriving
    ( ToJSON,
      FromJSON,
      Generic,
      Show
    )

packHie :: Components -> Value
packHie value = object [("cradle", object [("stack", toJSON value)])]

genComponents :: Pkg -> ConfigT [Component]
genComponents pkg = map comp . getSourceDirs [format $ pkgName pkg] <$> readCabalPackage pkg
  where
    comp (tag, sourceDirs) = Component {path = "./" <> pkgFile pkg (toString sourceDirs), component = tag}

syncHie :: ConfigT ()
syncHie = do
  Options {..} <- askOptions
  pkgs <- allPackages
  components <- concat <$> traverse genComponents pkgs
  rewrite_ optionsHie (const $ pure $ packHie Components {stackYaml = optionsStack, components})