data-rfc5280-0.1.0.0: src/Data/Rfc5280/PolicyMappings.hs
{-# LANGUAGE OverloadedStrings #-}
{- |
Module : Data.Rfc5280.PolicyMappings
Copyright : (c) 2026 Tim Emiola
Maintainer : Tim Emiola <adetokunbo@emio.la>
SPDX-License-Identifier: BSD3
Provides 'PolicyMappings', representing the X.509 Policy Mappings extension
(RFC 5280 §4.2.1.5).
-}
module Data.Rfc5280.PolicyMappings
( PolicyMappings (..)
, mkPolicyMappings
, PolicyMapping (..)
, mkPolicyMapping
)
where
import Data.List.NonEmpty (NonEmpty (..))
import Data.Rfc5280.HasOID (HasOID (..))
import Data.Rfc5280.Internal (OID, RenderConfig (..), intersperseCommas, oidBuilder)
{- | A single policy mapping, pairing an issuer domain policy OID with a
subject domain policy OID.
-}
data PolicyMapping = PolicyMapping
{ pmIssuerDomainPolicy :: !OID
-- ^ The issuer's policy OID.
, pmSubjectDomainPolicy :: !OID
-- ^ The subject's corresponding policy OID.
}
deriving (Eq, Show)
{- | Represents the PolicyMappings extension (RFC 5280 §4.2.1.5).
Contains one or more 'PolicyMapping' pairs. Use 'mkPolicyMappings' to
construct a value.
-}
newtype PolicyMappings = PolicyMappings (NonEmpty PolicyMapping)
deriving (Eq, Show)
-- | Construct a 'PolicyMapping' from an issuer domain policy OID and a subject domain policy OID.
mkPolicyMapping :: OID -> OID -> PolicyMapping
mkPolicyMapping = PolicyMapping
-- | Construct a 'PolicyMappings' from one or more 'PolicyMapping' values.
mkPolicyMappings :: PolicyMapping -> [PolicyMapping] -> PolicyMappings
mkPolicyMappings x xs = PolicyMappings (x :| xs)
instance HasOID PolicyMappings where
extensionOID _ = 2 :| [5, 29, 33]
instance RenderConfig PolicyMapping where
renderBuilder pm = oidBuilder (pmIssuerDomainPolicy pm) <> ":" <> oidBuilder (pmSubjectDomainPolicy pm)
instance RenderConfig PolicyMappings where
renderBuilder (PolicyMappings ms) = intersperseCommas (fmap renderBuilder ms)