-- | Using Plugins with SimpleOptions
module Plugins.Commands
  ( commandsFromPlugins
  , toCommand
  ) where

import Control.Monad.Trans.Either (EitherT)
import Control.Monad.Trans.Writer (Writer)
import Data.Text (Text, unpack)
import Data.Foldable (foldMap)
import Plugins
import Options.Applicative.Simple

-- | Generate the "commands" argument to simpleOptions
-- based on available plugins.
commandsFromPlugins :: Plugins -> EitherT Text (Writer (Mod CommandFields Text)) ()
commandsFromPlugins plugins = mapM_ toCommand (listPlugins plugins)

-- | Convert a single plugin into a command.
toCommand :: Plugin -> EitherT Text (Writer (Mod CommandFields Text)) ()
toCommand plugin = addCommand
  (unpack $ pluginName plugin)
  (unpack $ pluginSummary plugin)
  id
  (pure $ pluginName plugin)