{-# LANGUAGE OverloadedStrings #-}

-- | Functions for creating and calling Stackage plugins.
module Stackage.CLI
  ( -- * Discovering and calling plugins
    runStackagePlugin
  , Plugins
  , findPlugins
  , callPlugin
  , PluginException (..)

    -- * Creating your own plugin
  , commandsFromPlugins
  , simpleOptions
  , addCommand
  , simpleVersion

    -- * Finer-grained inspection of plugins
  , listPlugins
  , lookupPlugin
  , Plugin
  , pluginPrefix
  , pluginName
  , pluginSummary
  , pluginProc
  ) where

import Data.Text (Text)
import Plugins
import Plugins.Commands
import SimpleOptions

-- | Runs a stackage plugin. Handy for dynamic one-off runs,
-- but if you'll be running multiple plugins, it is recommended
-- that you use @findPlugins "stackage"@ so that the plugin search
-- is performed only once.
runStackagePlugin :: Text -> [String] -> IO ()
runStackagePlugin name args = do
  stackage <- findPlugins "stackage"
  callPlugin stackage name args