packages feed

henforcer-1.0.0.0: src/Henforcer/Config/IgnoreRules.hs

{- |
Module      : Henforcer.Config.IgnoreRules
Description : Functionality for specifying that some rules in TOML configuration file  should be ignored.
Copyright   : (c) Flipstone Technology Partners, 2023-2026
License     : MIT
Maintainer  : maintainers@flipstone.com
-}
module Henforcer.Config.IgnoreRules
  ( IgnoreRules (..)
  , RulesToIgnore (..)
  , rulestoIgnoreCodec
  , isRuleIgnored
  ) where

import Control.Applicative ((<|>))
import qualified Data.String as String
import qualified Toml

import qualified TomlHelper

{- | Do we want to ignore all rules or some that are listed. This serves as a way to make writing
the configuration for users easier, as they can quickly turn off all checks for a module.
-}
data RulesToIgnore
  = All !Bool
  | SpecificRulesToIgnore !IgnoreRules

matchAll :: RulesToIgnore -> Maybe Bool
matchAll (All b) = Just b
matchAll _ = Nothing

matchSpecificRulesToIgnore :: RulesToIgnore -> Maybe IgnoreRules
matchSpecificRulesToIgnore (All _) = Nothing
matchSpecificRulesToIgnore (SpecificRulesToIgnore rules) = Just rules

rulestoIgnoreCodec :: Toml.TomlCodec RulesToIgnore
rulestoIgnoreCodec =
  Toml.dimatch matchAll All (Toml.bool (String.fromString "all"))
    <|> Toml.dimatch matchSpecificRulesToIgnore SpecificRulesToIgnore ignoreRulesCodec

{- | Specify which rules to ignore, note that this is intended to be used when specifying modules in
some fashion. To ignore rules at the top level would be to simply not enable them.
-}
data IgnoreRules = IgnoreRules
  { ignoreRulesTreeDependencies :: !Bool
  , ignoreRulesEncapsulatedTrees :: !Bool
  , ignoreRulesAllowedQualifications :: !Bool
  , ignoreRulesAllowedOpenUnaliasedImports :: !Bool
  , ignoreRulesAllowedAliasUniqueness :: !Bool
  , ignoreRulesMaximumUndocumentedExports :: !Bool
  , ignoreRulesMinimumDocumentedExports :: !Bool
  , ignoreRulesMaximumExportsWithoutSince :: !Bool
  , ignoreRulesMinimumExportsWithSince :: !Bool
  , ignoreRulesModuleHeaderCopyrightMustExistNonEmpty :: !Bool
  , ignoreRulesModuleHeaderDescriptionMustExistNonEmpty :: !Bool
  , ignoreRulesModuleHeaderLicenseMustExistNonEmpty :: !Bool
  , ignoreRulesModuleHeaderMaintainerMustExistNonEmpty :: !Bool
  }

ignoreRulesCodec :: Toml.TomlCodec IgnoreRules
ignoreRulesCodec =
  IgnoreRules
    <$> TomlHelper.addField
      "treeDependencies"
      ignoreRulesTreeDependencies
      boolDefaultFalseField
    <*> TomlHelper.addField
      "encapsulatedTrees"
      ignoreRulesEncapsulatedTrees
      boolDefaultFalseField
    <*> TomlHelper.addField
      "allowedQualifications"
      ignoreRulesAllowedQualifications
      boolDefaultFalseField
    <*> TomlHelper.addField
      "allowedOpenUnaliasedImports"
      ignoreRulesAllowedOpenUnaliasedImports
      boolDefaultFalseField
    <*> TomlHelper.addField
      "allowedAliasUniqueness"
      ignoreRulesAllowedAliasUniqueness
      boolDefaultFalseField
    <*> TomlHelper.addField
      "maximumExportsPlusHeaderUndocumented"
      ignoreRulesMaximumUndocumentedExports
      boolDefaultFalseField
    <*> TomlHelper.addField
      "minimumExportsPlusHeaderDocumented"
      ignoreRulesMinimumDocumentedExports
      boolDefaultFalseField
    <*> TomlHelper.addField
      "maximumExportsWithoutSince"
      ignoreRulesMaximumExportsWithoutSince
      boolDefaultFalseField
    <*> TomlHelper.addField
      "minimumExportsWithSince"
      ignoreRulesMinimumExportsWithSince
      boolDefaultFalseField
    <*> TomlHelper.addField
      "moduleHeaderCopyrightMustExistNonEmpty"
      ignoreRulesModuleHeaderCopyrightMustExistNonEmpty
      boolDefaultFalseField
    <*> TomlHelper.addField
      "moduleHeaderDescriptionMustExistNonEmpty"
      ignoreRulesModuleHeaderDescriptionMustExistNonEmpty
      boolDefaultFalseField
    <*> TomlHelper.addField
      "moduleHeaderLicenseMustExistNonEmpty"
      ignoreRulesModuleHeaderLicenseMustExistNonEmpty
      boolDefaultFalseField
    <*> TomlHelper.addField
      "moduleHeaderMaintainerMustExistNonEmpty"
      ignoreRulesModuleHeaderMaintainerMustExistNonEmpty
      boolDefaultFalseField

-- | Default a 'Bool' field
boolDefaultFalseField :: Toml.Key -> Toml.TomlCodec Bool
boolDefaultFalseField =
  TomlHelper.setDefault False Toml.bool

isRuleIgnored ::
  (IgnoreRules -> Bool)
  -> RulesToIgnore
  -> Bool
isRuleIgnored _ (All b) = b
isRuleIgnored accessor (SpecificRulesToIgnore ignoreRules) =
  accessor ignoreRules