packages feed

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

{- |
Module      : Henforcer.Config
Description : Functionaly around specifying rules that apply to any given module.
Copyright   : (c) Flipstone Technology Partners, 2023-2026
License     : MIT
Maintainer  : maintainers@flipstone.com
-}
module Henforcer.Config.ForAnyModule
  ( ForAnyModule (..)
  , forAnyModuleCodec
  , emptyForAnyModule
  ) where

import qualified Toml

import qualified Henforcer.CodeStructure as CodeStructure
import Henforcer.Config.TreeDependencies (TreeDependency, treeDependencyCodec)
import qualified Henforcer.Rules as Rules
import qualified TomlHelper

data ForAnyModule = ForAnyModule
  { anyModuleTreeDependencies :: ![TreeDependency]
  , anyModuleEncapsulatedTrees :: ![CodeStructure.ModuleTree]
  , anyModuleAllowedQualifications :: !CodeStructure.AllowedSchemes
  , anyModuleAllowedOpenUnaliasedImports :: !Rules.MaximumAllowed
  , anyModuleAllowedAliasUniqueness :: !(Maybe CodeStructure.AllowedAliasUniqueness)
  , anyModuleMaximumUndocumentedExports :: !Rules.MaximumAllowed
  , anyModuleMinimumDocumentedExports :: !Rules.MinimumAllowed
  , anyModuleMaximumExportsWithoutSince :: !Rules.MaximumAllowed
  , anyModuleMinimumExportsWithSince :: !Rules.MinimumAllowed
  , anyModuleModuleHeaderCopyrightMustExistNonEmpty :: !Rules.MustExistNonEmpty
  , anyModuleModuleHeaderDescriptionMustExistNonEmpty :: !Rules.MustExistNonEmpty
  , anyModuleModuleHeaderLicenseMustExistNonEmpty :: !Rules.MustExistNonEmpty
  , anyModuleModuleHeaderMaintainerMustExistNonEmpty :: !Rules.MustExistNonEmpty
  }

forAnyModuleCodec :: Toml.TomlCodec ForAnyModule
forAnyModuleCodec =
  ForAnyModule
    <$> TomlHelper.addField
      "treeDependencies"
      anyModuleTreeDependencies
      (Toml.list treeDependencyCodec)
    <*> TomlHelper.addField
      "encapsulatedTrees"
      anyModuleEncapsulatedTrees
      (TomlHelper.setDefault [] CodeStructure.moduleTreeListCodec)
    <*> TomlHelper.addField
      "allowedQualifications"
      anyModuleAllowedQualifications
      CodeStructure.allowedSchemesCodec
    <*> TomlHelper.addField
      "allowedOpenUnaliasedImports"
      anyModuleAllowedOpenUnaliasedImports
      Rules.maximumAllowedCodec
    <*> TomlHelper.addField
      "allowedAliasUniqueness"
      anyModuleAllowedAliasUniqueness
      (Toml.dioptional . Toml.table CodeStructure.allowedAliasUniquenessCodec)
    <*> TomlHelper.addField
      "maximumExportsPlusHeaderUndocumented"
      anyModuleMaximumUndocumentedExports
      Rules.maximumAllowedCodec
    <*> TomlHelper.addField
      "minimumExportsPlusHeaderDocumented"
      anyModuleMinimumDocumentedExports
      Rules.minimumAllowedCodec
    <*> TomlHelper.addField
      "maximumExportsWithoutSince"
      anyModuleMaximumExportsWithoutSince
      Rules.maximumAllowedCodec
    <*> TomlHelper.addField
      "minimumExportsWithSince"
      anyModuleMinimumExportsWithSince
      Rules.minimumAllowedCodec
    <*> TomlHelper.addField
      "moduleHeaderCopyrightMustExistNonEmpty"
      anyModuleModuleHeaderCopyrightMustExistNonEmpty
      Rules.mustExistNonEmptyCodec
    <*> TomlHelper.addField
      "moduleHeaderDescriptionMustExistNonEmpty"
      anyModuleModuleHeaderDescriptionMustExistNonEmpty
      Rules.mustExistNonEmptyCodec
    <*> TomlHelper.addField
      "moduleHeaderLicenseMustExistNonEmpty"
      anyModuleModuleHeaderLicenseMustExistNonEmpty
      Rules.mustExistNonEmptyCodec
    <*> TomlHelper.addField
      "moduleHeaderMaintainerMustExistNonEmpty"
      anyModuleModuleHeaderMaintainerMustExistNonEmpty
      Rules.mustExistNonEmptyCodec

emptyForAnyModule :: ForAnyModule
emptyForAnyModule =
  ForAnyModule
    { anyModuleTreeDependencies = mempty
    , anyModuleEncapsulatedTrees = mempty
    , anyModuleAllowedQualifications = mempty
    , anyModuleAllowedOpenUnaliasedImports = Rules.NotEnforced
    , anyModuleAllowedAliasUniqueness = Nothing
    , anyModuleMaximumUndocumentedExports = Rules.NotEnforced
    , anyModuleMinimumDocumentedExports = Rules.NotEnforced
    , anyModuleMaximumExportsWithoutSince = Rules.NotEnforced
    , anyModuleMinimumExportsWithSince = Rules.NotEnforced
    , anyModuleModuleHeaderCopyrightMustExistNonEmpty = Rules.NotEnforced
    , anyModuleModuleHeaderDescriptionMustExistNonEmpty = Rules.NotEnforced
    , anyModuleModuleHeaderLicenseMustExistNonEmpty = Rules.NotEnforced
    , anyModuleModuleHeaderMaintainerMustExistNonEmpty = Rules.NotEnforced
    }