packages feed

seihou-core-0.4.0.0: src/Seihou/Composition/Recipe.hs

module Seihou.Composition.Recipe
  ( expandRecipe,
  )
where

import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Data.Text (Text)
import Seihou.Core.Recipe (validateRecipe)
import Seihou.Core.Types

type ExpandedRecipe = (ModuleName, [ModuleName], Map VarName Text, [VarDecl], [Prompt])

-- | Expand a 'Recipe' into the inputs that the existing composition pipeline
-- expects: a primary module name, additional module names, variable overrides,
-- recipe-level variable declarations, and recipe-level prompts.
--
-- The first module in the recipe's list becomes the primary module (used for
-- config namespace derivation). All remaining modules become additional modules.
-- Variable overrides are collected from each module entry's @depVars@ bindings.
expandRecipe :: Recipe -> Either [Text] ExpandedRecipe
expandRecipe recipe = do
  validated <- validateRecipe recipe
  case validated.modules of
    [] -> Left ["recipe must list at least one module"]
    primary : additional ->
      let primaryName = primary.depModule
          additionalNames = map (.depModule) additional
          overrides = Map.unions (map (.depVars) validated.modules)
       in Right (primaryName, additionalNames, overrides, validated.vars, validated.prompts)