packages feed

skeletest-0.4.0: src/Skeletest/Plugin.hs

{-# 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
  { cliFlags :: [Flag]
  , snapshotRenderers :: [SnapshotRenderer]
  , hooks :: Hooks
  }

instance Semigroup Plugin where
  plugin1 <> plugin2 =
    Plugin
      { cliFlags = plugin1.cliFlags <> plugin2.cliFlags
      , snapshotRenderers = plugin1.snapshotRenderers <> plugin2.snapshotRenderers
      , hooks = plugin1.hooks <> plugin2.hooks
      }

instance Monoid Plugin where
  mempty = defaultPlugin

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