{-# LANGUAGE TemplateHaskell #-}

-- |
-- Module: BDCS.ReqType
-- Copyright: (c) 2016-2017 Red Hat, Inc.
-- License: LGPL
--
-- Maintainer: https://github.com/weldr
-- Stability: alpha
-- Portability: portable
--
-- Data types for working with 'Requirements'.

module BDCS.ReqType(ReqContext(..),
                    ReqLanguage(..),
                    ReqStrength(..))
 where

import Database.Persist.TH

{-# ANN module "HLint: ignore Use module export list" #-}

-- | The type of a requirements language - this basically maps to a packaging
-- system.  For now, only RPM is supported.
data ReqLanguage = RPM
 deriving(Eq, Read, Show)

-- | The type for specifying when a requirement should be enforced.
data ReqContext = Build                 -- ^ Applies when building
                | Runtime               -- ^ Applies when the package is on the system
                | Test                  -- ^ Applies to running tests
                | ScriptPre             -- ^ Before a package install
                | ScriptPost            -- ^ After a package install
                | ScriptPreUn           -- ^ Before a package uninstall
                | ScriptPostUn          -- ^ After a package uninstall
                | ScriptPreTrans        -- ^ Before a package transaction
                | ScriptPostTrans       -- ^ After a package transaction
                | ScriptVerify          -- ^ Package verification script
                | Feature               -- ^ Feature requirement, e.g. rpmlib features
 deriving(Eq, Read, Show)

-- | The type for specifying how strictly a requirement should be enforced.
data ReqStrength = Must                 -- ^ A requirement must be satisfied
                 | Should               -- ^ A requirement should be satisfied, but it is
                                        --   not an error if it cannot be.
                 | May                  -- ^ A requirement should only be satisfied at the
                                        --   user's option.  Typically, automated processes
                                        --   will ignore this.
                 | ShouldIfInstalled    -- ^ Like 'Should', but looks at packages that are
                                        --   already installed.
                 | MayIfInstalled       -- ^ Like 'May', but looks at packages that are
                                        --   already installed.
 deriving(Eq, Read, Show)

derivePersistField "ReqLanguage"
derivePersistField "ReqContext"
derivePersistField "ReqStrength"