module Development.Iridium.Types
( Infos (..)
, Repo (..)
, NoRepo (..)
, LogLevel (..)
, LogState (..)
, Config
, repoRunChecks
, repoDisplaySummary
, repoActionSummary
, repoPerformAction
, CheckState (..)
)
where
import Prelude hiding ( FilePath )
import qualified Data.Yaml as Yaml
import Control.Monad.Trans.MultiRWS
import Control.Monad.Trans.MultiState
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Class
import Data.HList.HList
import Control.Monad.IO.Class
import Distribution.PackageDescription
import Data.Version ( Version(..) )
import Data.Proxy
import Data.Tagged
import Control.Applicative
import Control.Monad
import Data.HList.ContainsType
import Control.Monad.Trans.Control
import Control.Monad.Base
import qualified Filesystem.Path.CurrentOS as Path
data LogLevel = LogLevelSilent
| LogLevelPrint
| LogLevelDebug
| LogLevelTrace
| LogLevelWarn
| LogLevelError
| LogLevelInfo
| LogLevelInfoVerbose
| LogLevelInfoVerboser
| LogLevelInfoSpam
| LogLevelThread
deriving (Show, Eq)
data LogState = LogState
{ _log_mask :: [LogLevel]
, _log_indent :: Int
, _log_prepared :: Maybe String
, _log_cur :: String
}
type Config = Yaml.Value
data Infos = forall repo . Repo repo => Infos
{ _i_cwd :: Path.FilePath
, _i_package :: GenericPackageDescription
, _i_remote_version :: Maybe Version
, _i_repo :: repo
}
data CheckState = CheckState
{ _check_stack :: [String]
, _check_errorCount :: Int
, _check_warningCount :: Int
, _check_notWallClean :: [String]
}
class Repo a where
repo_retrieveInfo :: ( MonadIO m
, MonadPlus m
, MonadMultiReader Config m
, MonadMultiState LogState m
)
=> m a
repo_runChecks :: ( MonadIO m
, MonadPlus m
, MonadMultiReader Config m
, MonadMultiState LogState m
, MonadMultiState CheckState m
)
=> a -> m ()
repo_displaySummary :: ( MonadIO m
, MonadMultiReader Config m
, MonadMultiState LogState m
)
=> a -> m ()
repo_ActionSummary :: ( MonadMultiReader Config m
, MonadMultiReader Infos m
, MonadMultiState LogState m
)
=> a -> m [String]
repo_performAction :: ( MonadIO m
, MonadPlus m
, MonadMultiReader Config m
, MonadMultiReader Infos m
, MonadMultiState LogState m
)
=> a -> m ()
repoRunChecks
:: ( MonadIO m
, MonadPlus m
, MonadMultiReader Infos m
, MonadMultiReader Config m
, MonadMultiState LogState m
, MonadMultiState CheckState m
)
=> m ()
repoRunChecks = do
Infos _ _ _ repo <- mAsk
repo_runChecks repo
repoDisplaySummary
:: ( MonadIO m
, MonadMultiReader Infos m
, MonadMultiReader Config m
, MonadMultiState LogState m
)
=> m ()
repoDisplaySummary = do
Infos _ _ _ repo <- mAsk
repo_displaySummary repo
repoActionSummary
:: ( MonadIO m
, MonadMultiReader Infos m
, MonadMultiReader Config m
, MonadMultiState LogState m
)
=> m [String]
repoActionSummary = do
Infos _ _ _ repo <- mAsk
repo_ActionSummary repo
repoPerformAction
:: ( MonadIO m
, MonadPlus m
, MonadMultiReader Infos m
, MonadMultiReader Config m
, MonadMultiState LogState m
)
=> m ()
repoPerformAction = do
Infos _ _ _ repo <- mAsk
repo_performAction repo
data NoRepo = NoRepo
instance Repo NoRepo where
repo_retrieveInfo = return $ NoRepo
repo_runChecks _ = return ()
repo_displaySummary _ = return ()
repo_ActionSummary _ = return []
repo_performAction _ = return ()