{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE NoFieldSelectors #-}

-- | The module that contains everything needed to implement a plugin.
module Skeletest.Plugin (
  -- * Plugin
  Plugin (..),
  defaultPlugin,

  -- * Hooks
  module Skeletest.Hooks,
) where

import Skeletest.Hooks
import Skeletest.Internal.CLI (Flag)
import Skeletest.Internal.Snapshot.Renderer (SnapshotRenderer)

-- | A plugin for extending Skeletest.
--
-- Use 'defaultPlugin' instead of using v'Plugin' directly, to minimize
-- breaking changes.
data Plugin = Plugin
  { Plugin -> [Flag]
cliFlags :: [Flag]
  , Plugin -> [SnapshotRenderer]
snapshotRenderers :: [SnapshotRenderer]
  , Plugin -> Hooks
hooks :: Hooks
  }

instance Semigroup Plugin where
  Plugin
plugin1 <> :: Plugin -> Plugin -> Plugin
<> Plugin
plugin2 =
    Plugin
      { cliFlags :: [Flag]
cliFlags = Plugin
plugin1.cliFlags [Flag] -> [Flag] -> [Flag]
forall a. Semigroup a => a -> a -> a
<> Plugin
plugin2.cliFlags
      , snapshotRenderers :: [SnapshotRenderer]
snapshotRenderers = Plugin
plugin1.snapshotRenderers [SnapshotRenderer] -> [SnapshotRenderer] -> [SnapshotRenderer]
forall a. Semigroup a => a -> a -> a
<> Plugin
plugin2.snapshotRenderers
      , hooks :: Hooks
hooks = Plugin
plugin1.hooks Hooks -> Hooks -> Hooks
forall a. Semigroup a => a -> a -> a
<> Plugin
plugin2.hooks
      }

instance Monoid Plugin where
  mempty :: Plugin
mempty = Plugin
defaultPlugin

defaultPlugin :: Plugin
defaultPlugin :: Plugin
defaultPlugin =
  Plugin
    { cliFlags :: [Flag]
cliFlags = []
    , snapshotRenderers :: [SnapshotRenderer]
snapshotRenderers = []
    , hooks :: Hooks
hooks = Hooks
defaultHooks
    }