{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.CertificateManagerPCA.Types.GeneralName
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.CertificateManagerPCA.Types.GeneralName where

import Amazonka.CertificateManagerPCA.Types.ASN1Subject
import Amazonka.CertificateManagerPCA.Types.EdiPartyName
import Amazonka.CertificateManagerPCA.Types.OtherName
import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude

-- | Describes an ASN.1 X.400 @GeneralName@ as defined in
-- <https://datatracker.ietf.org/doc/html/rfc5280 RFC 5280>. Only one of
-- the following naming options should be provided. Providing more than one
-- option results in an @InvalidArgsException@ error.
--
-- /See:/ 'newGeneralName' smart constructor.
data GeneralName = GeneralName'
  { GeneralName -> Maybe ASN1Subject
directoryName :: Prelude.Maybe ASN1Subject,
    -- | Represents @GeneralName@ as a DNS name.
    GeneralName -> Maybe Text
dnsName :: Prelude.Maybe Prelude.Text,
    -- | Represents @GeneralName@ as an @EdiPartyName@ object.
    GeneralName -> Maybe EdiPartyName
ediPartyName :: Prelude.Maybe EdiPartyName,
    -- | Represents @GeneralName@ as an IPv4 or IPv6 address.
    GeneralName -> Maybe Text
ipAddress :: Prelude.Maybe Prelude.Text,
    -- | Represents @GeneralName@ using an @OtherName@ object.
    GeneralName -> Maybe OtherName
otherName :: Prelude.Maybe OtherName,
    -- | Represents @GeneralName@ as an object identifier (OID).
    GeneralName -> Maybe Text
registeredId :: Prelude.Maybe Prelude.Text,
    -- | Represents @GeneralName@ as an
    -- <https://datatracker.ietf.org/doc/html/rfc822 RFC 822> email address.
    GeneralName -> Maybe Text
rfc822Name :: Prelude.Maybe Prelude.Text,
    -- | Represents @GeneralName@ as a URI.
    GeneralName -> Maybe Text
uniformResourceIdentifier :: Prelude.Maybe Prelude.Text
  }
  deriving (GeneralName -> GeneralName -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GeneralName -> GeneralName -> Bool
$c/= :: GeneralName -> GeneralName -> Bool
== :: GeneralName -> GeneralName -> Bool
$c== :: GeneralName -> GeneralName -> Bool
Prelude.Eq, ReadPrec [GeneralName]
ReadPrec GeneralName
Int -> ReadS GeneralName
ReadS [GeneralName]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GeneralName]
$creadListPrec :: ReadPrec [GeneralName]
readPrec :: ReadPrec GeneralName
$creadPrec :: ReadPrec GeneralName
readList :: ReadS [GeneralName]
$creadList :: ReadS [GeneralName]
readsPrec :: Int -> ReadS GeneralName
$creadsPrec :: Int -> ReadS GeneralName
Prelude.Read, Int -> GeneralName -> ShowS
[GeneralName] -> ShowS
GeneralName -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GeneralName] -> ShowS
$cshowList :: [GeneralName] -> ShowS
show :: GeneralName -> String
$cshow :: GeneralName -> String
showsPrec :: Int -> GeneralName -> ShowS
$cshowsPrec :: Int -> GeneralName -> ShowS
Prelude.Show, forall x. Rep GeneralName x -> GeneralName
forall x. GeneralName -> Rep GeneralName x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GeneralName x -> GeneralName
$cfrom :: forall x. GeneralName -> Rep GeneralName x
Prelude.Generic)

-- |
-- Create a value of 'GeneralName' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'directoryName', 'generalName_directoryName' - Undocumented member.
--
-- 'dnsName', 'generalName_dnsName' - Represents @GeneralName@ as a DNS name.
--
-- 'ediPartyName', 'generalName_ediPartyName' - Represents @GeneralName@ as an @EdiPartyName@ object.
--
-- 'ipAddress', 'generalName_ipAddress' - Represents @GeneralName@ as an IPv4 or IPv6 address.
--
-- 'otherName', 'generalName_otherName' - Represents @GeneralName@ using an @OtherName@ object.
--
-- 'registeredId', 'generalName_registeredId' - Represents @GeneralName@ as an object identifier (OID).
--
-- 'rfc822Name', 'generalName_rfc822Name' - Represents @GeneralName@ as an
-- <https://datatracker.ietf.org/doc/html/rfc822 RFC 822> email address.
--
-- 'uniformResourceIdentifier', 'generalName_uniformResourceIdentifier' - Represents @GeneralName@ as a URI.
newGeneralName ::
  GeneralName
newGeneralName :: GeneralName
newGeneralName =
  GeneralName'
    { $sel:directoryName:GeneralName' :: Maybe ASN1Subject
directoryName = forall a. Maybe a
Prelude.Nothing,
      $sel:dnsName:GeneralName' :: Maybe Text
dnsName = forall a. Maybe a
Prelude.Nothing,
      $sel:ediPartyName:GeneralName' :: Maybe EdiPartyName
ediPartyName = forall a. Maybe a
Prelude.Nothing,
      $sel:ipAddress:GeneralName' :: Maybe Text
ipAddress = forall a. Maybe a
Prelude.Nothing,
      $sel:otherName:GeneralName' :: Maybe OtherName
otherName = forall a. Maybe a
Prelude.Nothing,
      $sel:registeredId:GeneralName' :: Maybe Text
registeredId = forall a. Maybe a
Prelude.Nothing,
      $sel:rfc822Name:GeneralName' :: Maybe Text
rfc822Name = forall a. Maybe a
Prelude.Nothing,
      $sel:uniformResourceIdentifier:GeneralName' :: Maybe Text
uniformResourceIdentifier = forall a. Maybe a
Prelude.Nothing
    }

-- | Undocumented member.
generalName_directoryName :: Lens.Lens' GeneralName (Prelude.Maybe ASN1Subject)
generalName_directoryName :: Lens' GeneralName (Maybe ASN1Subject)
generalName_directoryName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe ASN1Subject
directoryName :: Maybe ASN1Subject
$sel:directoryName:GeneralName' :: GeneralName -> Maybe ASN1Subject
directoryName} -> Maybe ASN1Subject
directoryName) (\s :: GeneralName
s@GeneralName' {} Maybe ASN1Subject
a -> GeneralName
s {$sel:directoryName:GeneralName' :: Maybe ASN1Subject
directoryName = Maybe ASN1Subject
a} :: GeneralName)

-- | Represents @GeneralName@ as a DNS name.
generalName_dnsName :: Lens.Lens' GeneralName (Prelude.Maybe Prelude.Text)
generalName_dnsName :: Lens' GeneralName (Maybe Text)
generalName_dnsName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe Text
dnsName :: Maybe Text
$sel:dnsName:GeneralName' :: GeneralName -> Maybe Text
dnsName} -> Maybe Text
dnsName) (\s :: GeneralName
s@GeneralName' {} Maybe Text
a -> GeneralName
s {$sel:dnsName:GeneralName' :: Maybe Text
dnsName = Maybe Text
a} :: GeneralName)

-- | Represents @GeneralName@ as an @EdiPartyName@ object.
generalName_ediPartyName :: Lens.Lens' GeneralName (Prelude.Maybe EdiPartyName)
generalName_ediPartyName :: Lens' GeneralName (Maybe EdiPartyName)
generalName_ediPartyName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe EdiPartyName
ediPartyName :: Maybe EdiPartyName
$sel:ediPartyName:GeneralName' :: GeneralName -> Maybe EdiPartyName
ediPartyName} -> Maybe EdiPartyName
ediPartyName) (\s :: GeneralName
s@GeneralName' {} Maybe EdiPartyName
a -> GeneralName
s {$sel:ediPartyName:GeneralName' :: Maybe EdiPartyName
ediPartyName = Maybe EdiPartyName
a} :: GeneralName)

-- | Represents @GeneralName@ as an IPv4 or IPv6 address.
generalName_ipAddress :: Lens.Lens' GeneralName (Prelude.Maybe Prelude.Text)
generalName_ipAddress :: Lens' GeneralName (Maybe Text)
generalName_ipAddress = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe Text
ipAddress :: Maybe Text
$sel:ipAddress:GeneralName' :: GeneralName -> Maybe Text
ipAddress} -> Maybe Text
ipAddress) (\s :: GeneralName
s@GeneralName' {} Maybe Text
a -> GeneralName
s {$sel:ipAddress:GeneralName' :: Maybe Text
ipAddress = Maybe Text
a} :: GeneralName)

-- | Represents @GeneralName@ using an @OtherName@ object.
generalName_otherName :: Lens.Lens' GeneralName (Prelude.Maybe OtherName)
generalName_otherName :: Lens' GeneralName (Maybe OtherName)
generalName_otherName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe OtherName
otherName :: Maybe OtherName
$sel:otherName:GeneralName' :: GeneralName -> Maybe OtherName
otherName} -> Maybe OtherName
otherName) (\s :: GeneralName
s@GeneralName' {} Maybe OtherName
a -> GeneralName
s {$sel:otherName:GeneralName' :: Maybe OtherName
otherName = Maybe OtherName
a} :: GeneralName)

-- | Represents @GeneralName@ as an object identifier (OID).
generalName_registeredId :: Lens.Lens' GeneralName (Prelude.Maybe Prelude.Text)
generalName_registeredId :: Lens' GeneralName (Maybe Text)
generalName_registeredId = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe Text
registeredId :: Maybe Text
$sel:registeredId:GeneralName' :: GeneralName -> Maybe Text
registeredId} -> Maybe Text
registeredId) (\s :: GeneralName
s@GeneralName' {} Maybe Text
a -> GeneralName
s {$sel:registeredId:GeneralName' :: Maybe Text
registeredId = Maybe Text
a} :: GeneralName)

-- | Represents @GeneralName@ as an
-- <https://datatracker.ietf.org/doc/html/rfc822 RFC 822> email address.
generalName_rfc822Name :: Lens.Lens' GeneralName (Prelude.Maybe Prelude.Text)
generalName_rfc822Name :: Lens' GeneralName (Maybe Text)
generalName_rfc822Name = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe Text
rfc822Name :: Maybe Text
$sel:rfc822Name:GeneralName' :: GeneralName -> Maybe Text
rfc822Name} -> Maybe Text
rfc822Name) (\s :: GeneralName
s@GeneralName' {} Maybe Text
a -> GeneralName
s {$sel:rfc822Name:GeneralName' :: Maybe Text
rfc822Name = Maybe Text
a} :: GeneralName)

-- | Represents @GeneralName@ as a URI.
generalName_uniformResourceIdentifier :: Lens.Lens' GeneralName (Prelude.Maybe Prelude.Text)
generalName_uniformResourceIdentifier :: Lens' GeneralName (Maybe Text)
generalName_uniformResourceIdentifier = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GeneralName' {Maybe Text
uniformResourceIdentifier :: Maybe Text
$sel:uniformResourceIdentifier:GeneralName' :: GeneralName -> Maybe Text
uniformResourceIdentifier} -> Maybe Text
uniformResourceIdentifier) (\s :: GeneralName
s@GeneralName' {} Maybe Text
a -> GeneralName
s {$sel:uniformResourceIdentifier:GeneralName' :: Maybe Text
uniformResourceIdentifier = Maybe Text
a} :: GeneralName)

instance Data.FromJSON GeneralName where
  parseJSON :: Value -> Parser GeneralName
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"GeneralName"
      ( \Object
x ->
          Maybe ASN1Subject
-> Maybe Text
-> Maybe EdiPartyName
-> Maybe Text
-> Maybe OtherName
-> Maybe Text
-> Maybe Text
-> Maybe Text
-> GeneralName
GeneralName'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"DirectoryName")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"DnsName")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"EdiPartyName")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"IpAddress")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"OtherName")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"RegisteredId")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"Rfc822Name")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"UniformResourceIdentifier")
      )

instance Prelude.Hashable GeneralName where
  hashWithSalt :: Int -> GeneralName -> Int
hashWithSalt Int
_salt GeneralName' {Maybe Text
Maybe ASN1Subject
Maybe EdiPartyName
Maybe OtherName
uniformResourceIdentifier :: Maybe Text
rfc822Name :: Maybe Text
registeredId :: Maybe Text
otherName :: Maybe OtherName
ipAddress :: Maybe Text
ediPartyName :: Maybe EdiPartyName
dnsName :: Maybe Text
directoryName :: Maybe ASN1Subject
$sel:uniformResourceIdentifier:GeneralName' :: GeneralName -> Maybe Text
$sel:rfc822Name:GeneralName' :: GeneralName -> Maybe Text
$sel:registeredId:GeneralName' :: GeneralName -> Maybe Text
$sel:otherName:GeneralName' :: GeneralName -> Maybe OtherName
$sel:ipAddress:GeneralName' :: GeneralName -> Maybe Text
$sel:ediPartyName:GeneralName' :: GeneralName -> Maybe EdiPartyName
$sel:dnsName:GeneralName' :: GeneralName -> Maybe Text
$sel:directoryName:GeneralName' :: GeneralName -> Maybe ASN1Subject
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ASN1Subject
directoryName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
dnsName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe EdiPartyName
ediPartyName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
ipAddress
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe OtherName
otherName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
registeredId
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
rfc822Name
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
uniformResourceIdentifier

instance Prelude.NFData GeneralName where
  rnf :: GeneralName -> ()
rnf GeneralName' {Maybe Text
Maybe ASN1Subject
Maybe EdiPartyName
Maybe OtherName
uniformResourceIdentifier :: Maybe Text
rfc822Name :: Maybe Text
registeredId :: Maybe Text
otherName :: Maybe OtherName
ipAddress :: Maybe Text
ediPartyName :: Maybe EdiPartyName
dnsName :: Maybe Text
directoryName :: Maybe ASN1Subject
$sel:uniformResourceIdentifier:GeneralName' :: GeneralName -> Maybe Text
$sel:rfc822Name:GeneralName' :: GeneralName -> Maybe Text
$sel:registeredId:GeneralName' :: GeneralName -> Maybe Text
$sel:otherName:GeneralName' :: GeneralName -> Maybe OtherName
$sel:ipAddress:GeneralName' :: GeneralName -> Maybe Text
$sel:ediPartyName:GeneralName' :: GeneralName -> Maybe EdiPartyName
$sel:dnsName:GeneralName' :: GeneralName -> Maybe Text
$sel:directoryName:GeneralName' :: GeneralName -> Maybe ASN1Subject
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe ASN1Subject
directoryName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
dnsName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe EdiPartyName
ediPartyName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
ipAddress
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe OtherName
otherName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
registeredId
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
rfc822Name
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
uniformResourceIdentifier

instance Data.ToJSON GeneralName where
  toJSON :: GeneralName -> Value
toJSON GeneralName' {Maybe Text
Maybe ASN1Subject
Maybe EdiPartyName
Maybe OtherName
uniformResourceIdentifier :: Maybe Text
rfc822Name :: Maybe Text
registeredId :: Maybe Text
otherName :: Maybe OtherName
ipAddress :: Maybe Text
ediPartyName :: Maybe EdiPartyName
dnsName :: Maybe Text
directoryName :: Maybe ASN1Subject
$sel:uniformResourceIdentifier:GeneralName' :: GeneralName -> Maybe Text
$sel:rfc822Name:GeneralName' :: GeneralName -> Maybe Text
$sel:registeredId:GeneralName' :: GeneralName -> Maybe Text
$sel:otherName:GeneralName' :: GeneralName -> Maybe OtherName
$sel:ipAddress:GeneralName' :: GeneralName -> Maybe Text
$sel:ediPartyName:GeneralName' :: GeneralName -> Maybe EdiPartyName
$sel:dnsName:GeneralName' :: GeneralName -> Maybe Text
$sel:directoryName:GeneralName' :: GeneralName -> Maybe ASN1Subject
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"DirectoryName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe ASN1Subject
directoryName,
            (Key
"DnsName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
dnsName,
            (Key
"EdiPartyName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe EdiPartyName
ediPartyName,
            (Key
"IpAddress" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
ipAddress,
            (Key
"OtherName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe OtherName
otherName,
            (Key
"RegisteredId" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
registeredId,
            (Key
"Rfc822Name" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
rfc822Name,
            (Key
"UniformResourceIdentifier" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Text
uniformResourceIdentifier
          ]
      )