packages feed

settei-0.1.0.0: src/Settei/Schema.hs

-- |
-- Module: Settei.Schema
-- Description: Static setting and branch metadata returned by Settei.Config.describe.
--
-- Possible settings occur somewhere in a declaration. Necessary settings are
-- conservatively known to run on every path. Required versus optional is separate: it
-- controls whether absence is an error when a request actually runs.
module Settei.Schema
  ( Condition,
    Presence (..),
    Requirement (..),
    Schema,
    SchemaSetting,
    conditionDependencies,
    conditionSettings,
    schemaConditions,
    schemaNecessary,
    schemaPossible,
    schemaSettingDescription,
    schemaSettingKey,
    schemaSettingPresence,
    schemaSettingRequirement,
    schemaSettingSensitivity,
  )
where

import Data.Generics.Labels ()
import Data.Map.Strict qualified as Map
import Settei.Internal.Schema
  ( Condition,
    Presence (..),
    Requirement (..),
    Schema,
    SchemaSetting,
  )
import Settei.Key (Key)
import Settei.Prelude
import Settei.Setting (Sensitivity)

-- | Every setting that may be requested, in key order.
schemaPossible :: Schema -> [SchemaSetting]
schemaPossible schema = Map.elems (schema ^. #settings)

-- | Settings evaluated on every execution path, in key order.
schemaNecessary :: Schema -> [SchemaSetting]
schemaNecessary = filter ((== Necessary) . schemaSettingPresence) . schemaPossible

-- | The conservative selective relationships in declaration order.
schemaConditions :: Schema -> [Condition]
schemaConditions schema = schema ^. #conditions

-- | Return a schema entry's validated key.
schemaSettingKey :: SchemaSetting -> Key
schemaSettingKey schemaEntry = schemaEntry ^. #key

-- | Return a schema entry's human-readable purpose.
schemaSettingDescription :: SchemaSetting -> Text
schemaSettingDescription schemaEntry = schemaEntry ^. #description

-- | Return whether reports must redact a schema entry's value.
schemaSettingSensitivity :: SchemaSetting -> Sensitivity
schemaSettingSensitivity schemaEntry = schemaEntry ^. #sensitivity

-- | Return whether absence is an error when this request runs.
schemaSettingRequirement :: SchemaSetting -> Requirement
schemaSettingRequirement schemaEntry = schemaEntry ^. #requirement

-- | Return whether this request is statically necessary or conditional.
schemaSettingPresence :: SchemaSetting -> Presence
schemaSettingPresence schemaEntry = schemaEntry ^. #presence

-- | Return the selector keys on which a condition depends.
conditionDependencies :: Condition -> Set Key
conditionDependencies condition = condition ^. #dependencies

-- | Return the setting keys activated by a condition.
conditionSettings :: Condition -> Set Key
conditionSettings condition = condition ^. #settings