{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE RecordWildCards #-}
module Git.Vogue.Types where
import Data.Function
import Data.Monoid
import Data.Ord
import Data.Semigroup (Semigroup)
import Data.String
import Data.Text.Lazy (Text)
import qualified Data.Text.Lazy as T
data VogueOptions = Options
{ optSearch :: SearchMode
, optCommand :: VogueCommand
, optDisable :: [PluginName]
, optVCS :: VCSType
}
deriving (Eq, Show)
data VCSType = Git | Null
deriving (Eq, Show)
data VogueCommand
= CmdInit
| CmdVerify
| CmdPlugins
| CmdDisable PluginName
| CmdEnable PluginName
| CmdRunCheck
| CmdRunFix
deriving (Eq, Show)
data Check
data Fix
data Result
= Success Text
| Failure Text
| Catastrophe Int Text
deriving (Show, Ord, Eq)
data Plugin m = Plugin
{ pluginName :: PluginName
, enabled :: Bool
, runCheck :: [FilePath] -> [FilePath] -> m Result
, runFix :: [FilePath] -> [FilePath] -> m Result
}
instance Show (Plugin m) where
show Plugin{..} =
T.unpack (unPluginName pluginName)
<> if enabled then mempty else " (disabled)"
instance Eq (Plugin m) where
(==) = (==) `on` pluginName
instance Ord (Plugin m) where
compare = comparing pluginName
newtype PluginName = PluginName {
unPluginName :: Text
} deriving (Show, Ord, Eq, IsString, Semigroup, Monoid)
data SearchMode
= FindAll
| FindChanged
| FindSpecific [FilePath]
deriving (Eq, Show)
data PluginDiscoverer m = PluginDiscoverer
{ discoverPlugins :: m [Plugin m]
, disablePlugin :: PluginName -> m ()
, enablePlugin :: PluginName -> m ()
}
data VCS m = VCS
{ getFiles :: SearchMode -> m [FilePath]
, installHook :: m ()
, removeHook :: m ()
, checkHook :: m Bool
, getTopLevel :: m FilePath
}