packages feed

amazonka-ec2-2.0: gen/Amazonka/EC2/Types/Explanation.hs

{-# 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.EC2.Types.Explanation
-- 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.EC2.Types.Explanation where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.EC2.Internal
import Amazonka.EC2.Types.AnalysisAclRule
import Amazonka.EC2.Types.AnalysisComponent
import Amazonka.EC2.Types.AnalysisLoadBalancerListener
import Amazonka.EC2.Types.AnalysisLoadBalancerTarget
import Amazonka.EC2.Types.AnalysisRouteTableRoute
import Amazonka.EC2.Types.AnalysisSecurityGroupRule
import Amazonka.EC2.Types.PortRange
import Amazonka.EC2.Types.TransitGatewayRouteTableRoute
import qualified Amazonka.Prelude as Prelude

-- | Describes an explanation code for an unreachable path. For more
-- information, see
-- <https://docs.aws.amazon.com/vpc/latest/reachability/explanation-codes.html Reachability Analyzer explanation codes>.
--
-- /See:/ 'newExplanation' smart constructor.
data Explanation = Explanation'
  { -- | The network ACL.
    acl :: Prelude.Maybe AnalysisComponent,
    -- | The network ACL rule.
    aclRule :: Prelude.Maybe AnalysisAclRule,
    -- | The IPv4 address, in CIDR notation.
    address :: Prelude.Maybe Prelude.Text,
    -- | The IPv4 addresses, in CIDR notation.
    addresses :: Prelude.Maybe [Prelude.Text],
    -- | The resource to which the component is attached.
    attachedTo :: Prelude.Maybe AnalysisComponent,
    -- | The Availability Zones.
    availabilityZones :: Prelude.Maybe [Prelude.Text],
    -- | The CIDR ranges.
    cidrs :: Prelude.Maybe [Prelude.Text],
    -- | The listener for a Classic Load Balancer.
    classicLoadBalancerListener :: Prelude.Maybe AnalysisLoadBalancerListener,
    -- | The component.
    component :: Prelude.Maybe AnalysisComponent,
    -- | The Amazon Web Services account for the component.
    componentAccount :: Prelude.Maybe Prelude.Text,
    -- | The Region for the component.
    componentRegion :: Prelude.Maybe Prelude.Text,
    -- | The customer gateway.
    customerGateway :: Prelude.Maybe AnalysisComponent,
    -- | The destination.
    destination :: Prelude.Maybe AnalysisComponent,
    -- | The destination VPC.
    destinationVpc :: Prelude.Maybe AnalysisComponent,
    -- | The direction. The following are the possible values:
    --
    -- -   egress
    --
    -- -   ingress
    direction :: Prelude.Maybe Prelude.Text,
    -- | The load balancer listener.
    elasticLoadBalancerListener :: Prelude.Maybe AnalysisComponent,
    -- | The explanation code.
    explanationCode :: Prelude.Maybe Prelude.Text,
    -- | The route table.
    ingressRouteTable :: Prelude.Maybe AnalysisComponent,
    -- | The internet gateway.
    internetGateway :: Prelude.Maybe AnalysisComponent,
    -- | The Amazon Resource Name (ARN) of the load balancer.
    loadBalancerArn :: Prelude.Maybe Prelude.Text,
    -- | The listener port of the load balancer.
    loadBalancerListenerPort :: Prelude.Maybe Prelude.Natural,
    -- | The target.
    loadBalancerTarget :: Prelude.Maybe AnalysisLoadBalancerTarget,
    -- | The target group.
    loadBalancerTargetGroup :: Prelude.Maybe AnalysisComponent,
    -- | The target groups.
    loadBalancerTargetGroups :: Prelude.Maybe [AnalysisComponent],
    -- | The target port.
    loadBalancerTargetPort :: Prelude.Maybe Prelude.Natural,
    -- | The missing component.
    missingComponent :: Prelude.Maybe Prelude.Text,
    -- | The NAT gateway.
    natGateway :: Prelude.Maybe AnalysisComponent,
    -- | The network interface.
    networkInterface :: Prelude.Maybe AnalysisComponent,
    -- | The packet field.
    packetField :: Prelude.Maybe Prelude.Text,
    -- | The port.
    port :: Prelude.Maybe Prelude.Natural,
    -- | The port ranges.
    portRanges :: Prelude.Maybe [PortRange],
    -- | The prefix list.
    prefixList :: Prelude.Maybe AnalysisComponent,
    -- | The protocols.
    protocols :: Prelude.Maybe [Prelude.Text],
    -- | The route table.
    routeTable :: Prelude.Maybe AnalysisComponent,
    -- | The route table route.
    routeTableRoute :: Prelude.Maybe AnalysisRouteTableRoute,
    -- | The security group.
    securityGroup :: Prelude.Maybe AnalysisComponent,
    -- | The security group rule.
    securityGroupRule :: Prelude.Maybe AnalysisSecurityGroupRule,
    -- | The security groups.
    securityGroups :: Prelude.Maybe [AnalysisComponent],
    -- | The source VPC.
    sourceVpc :: Prelude.Maybe AnalysisComponent,
    -- | The state.
    state :: Prelude.Maybe Prelude.Text,
    -- | The subnet.
    subnet :: Prelude.Maybe AnalysisComponent,
    -- | The route table for the subnet.
    subnetRouteTable :: Prelude.Maybe AnalysisComponent,
    -- | The transit gateway.
    transitGateway :: Prelude.Maybe AnalysisComponent,
    -- | The transit gateway attachment.
    transitGatewayAttachment :: Prelude.Maybe AnalysisComponent,
    -- | The transit gateway route table.
    transitGatewayRouteTable :: Prelude.Maybe AnalysisComponent,
    -- | The transit gateway route table route.
    transitGatewayRouteTableRoute :: Prelude.Maybe TransitGatewayRouteTableRoute,
    -- | The component VPC.
    vpc :: Prelude.Maybe AnalysisComponent,
    -- | The VPC endpoint.
    vpcEndpoint :: Prelude.Maybe AnalysisComponent,
    -- | The VPC peering connection.
    vpcPeeringConnection :: Prelude.Maybe AnalysisComponent,
    -- | The VPN connection.
    vpnConnection :: Prelude.Maybe AnalysisComponent,
    -- | The VPN gateway.
    vpnGateway :: Prelude.Maybe AnalysisComponent
  }
  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)

-- |
-- Create a value of 'Explanation' 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:
--
-- 'acl', 'explanation_acl' - The network ACL.
--
-- 'aclRule', 'explanation_aclRule' - The network ACL rule.
--
-- 'address', 'explanation_address' - The IPv4 address, in CIDR notation.
--
-- 'addresses', 'explanation_addresses' - The IPv4 addresses, in CIDR notation.
--
-- 'attachedTo', 'explanation_attachedTo' - The resource to which the component is attached.
--
-- 'availabilityZones', 'explanation_availabilityZones' - The Availability Zones.
--
-- 'cidrs', 'explanation_cidrs' - The CIDR ranges.
--
-- 'classicLoadBalancerListener', 'explanation_classicLoadBalancerListener' - The listener for a Classic Load Balancer.
--
-- 'component', 'explanation_component' - The component.
--
-- 'componentAccount', 'explanation_componentAccount' - The Amazon Web Services account for the component.
--
-- 'componentRegion', 'explanation_componentRegion' - The Region for the component.
--
-- 'customerGateway', 'explanation_customerGateway' - The customer gateway.
--
-- 'destination', 'explanation_destination' - The destination.
--
-- 'destinationVpc', 'explanation_destinationVpc' - The destination VPC.
--
-- 'direction', 'explanation_direction' - The direction. The following are the possible values:
--
-- -   egress
--
-- -   ingress
--
-- 'elasticLoadBalancerListener', 'explanation_elasticLoadBalancerListener' - The load balancer listener.
--
-- 'explanationCode', 'explanation_explanationCode' - The explanation code.
--
-- 'ingressRouteTable', 'explanation_ingressRouteTable' - The route table.
--
-- 'internetGateway', 'explanation_internetGateway' - The internet gateway.
--
-- 'loadBalancerArn', 'explanation_loadBalancerArn' - The Amazon Resource Name (ARN) of the load balancer.
--
-- 'loadBalancerListenerPort', 'explanation_loadBalancerListenerPort' - The listener port of the load balancer.
--
-- 'loadBalancerTarget', 'explanation_loadBalancerTarget' - The target.
--
-- 'loadBalancerTargetGroup', 'explanation_loadBalancerTargetGroup' - The target group.
--
-- 'loadBalancerTargetGroups', 'explanation_loadBalancerTargetGroups' - The target groups.
--
-- 'loadBalancerTargetPort', 'explanation_loadBalancerTargetPort' - The target port.
--
-- 'missingComponent', 'explanation_missingComponent' - The missing component.
--
-- 'natGateway', 'explanation_natGateway' - The NAT gateway.
--
-- 'networkInterface', 'explanation_networkInterface' - The network interface.
--
-- 'packetField', 'explanation_packetField' - The packet field.
--
-- 'port', 'explanation_port' - The port.
--
-- 'portRanges', 'explanation_portRanges' - The port ranges.
--
-- 'prefixList', 'explanation_prefixList' - The prefix list.
--
-- 'protocols', 'explanation_protocols' - The protocols.
--
-- 'routeTable', 'explanation_routeTable' - The route table.
--
-- 'routeTableRoute', 'explanation_routeTableRoute' - The route table route.
--
-- 'securityGroup', 'explanation_securityGroup' - The security group.
--
-- 'securityGroupRule', 'explanation_securityGroupRule' - The security group rule.
--
-- 'securityGroups', 'explanation_securityGroups' - The security groups.
--
-- 'sourceVpc', 'explanation_sourceVpc' - The source VPC.
--
-- 'state', 'explanation_state' - The state.
--
-- 'subnet', 'explanation_subnet' - The subnet.
--
-- 'subnetRouteTable', 'explanation_subnetRouteTable' - The route table for the subnet.
--
-- 'transitGateway', 'explanation_transitGateway' - The transit gateway.
--
-- 'transitGatewayAttachment', 'explanation_transitGatewayAttachment' - The transit gateway attachment.
--
-- 'transitGatewayRouteTable', 'explanation_transitGatewayRouteTable' - The transit gateway route table.
--
-- 'transitGatewayRouteTableRoute', 'explanation_transitGatewayRouteTableRoute' - The transit gateway route table route.
--
-- 'vpc', 'explanation_vpc' - The component VPC.
--
-- 'vpcEndpoint', 'explanation_vpcEndpoint' - The VPC endpoint.
--
-- 'vpcPeeringConnection', 'explanation_vpcPeeringConnection' - The VPC peering connection.
--
-- 'vpnConnection', 'explanation_vpnConnection' - The VPN connection.
--
-- 'vpnGateway', 'explanation_vpnGateway' - The VPN gateway.
newExplanation ::
  Explanation
newExplanation =
  Explanation'
    { acl = Prelude.Nothing,
      aclRule = Prelude.Nothing,
      address = Prelude.Nothing,
      addresses = Prelude.Nothing,
      attachedTo = Prelude.Nothing,
      availabilityZones = Prelude.Nothing,
      cidrs = Prelude.Nothing,
      classicLoadBalancerListener = Prelude.Nothing,
      component = Prelude.Nothing,
      componentAccount = Prelude.Nothing,
      componentRegion = Prelude.Nothing,
      customerGateway = Prelude.Nothing,
      destination = Prelude.Nothing,
      destinationVpc = Prelude.Nothing,
      direction = Prelude.Nothing,
      elasticLoadBalancerListener = Prelude.Nothing,
      explanationCode = Prelude.Nothing,
      ingressRouteTable = Prelude.Nothing,
      internetGateway = Prelude.Nothing,
      loadBalancerArn = Prelude.Nothing,
      loadBalancerListenerPort = Prelude.Nothing,
      loadBalancerTarget = Prelude.Nothing,
      loadBalancerTargetGroup = Prelude.Nothing,
      loadBalancerTargetGroups = Prelude.Nothing,
      loadBalancerTargetPort = Prelude.Nothing,
      missingComponent = Prelude.Nothing,
      natGateway = Prelude.Nothing,
      networkInterface = Prelude.Nothing,
      packetField = Prelude.Nothing,
      port = Prelude.Nothing,
      portRanges = Prelude.Nothing,
      prefixList = Prelude.Nothing,
      protocols = Prelude.Nothing,
      routeTable = Prelude.Nothing,
      routeTableRoute = Prelude.Nothing,
      securityGroup = Prelude.Nothing,
      securityGroupRule = Prelude.Nothing,
      securityGroups = Prelude.Nothing,
      sourceVpc = Prelude.Nothing,
      state = Prelude.Nothing,
      subnet = Prelude.Nothing,
      subnetRouteTable = Prelude.Nothing,
      transitGateway = Prelude.Nothing,
      transitGatewayAttachment = Prelude.Nothing,
      transitGatewayRouteTable = Prelude.Nothing,
      transitGatewayRouteTableRoute = Prelude.Nothing,
      vpc = Prelude.Nothing,
      vpcEndpoint = Prelude.Nothing,
      vpcPeeringConnection = Prelude.Nothing,
      vpnConnection = Prelude.Nothing,
      vpnGateway = Prelude.Nothing
    }

-- | The network ACL.
explanation_acl :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_acl = Lens.lens (\Explanation' {acl} -> acl) (\s@Explanation' {} a -> s {acl = a} :: Explanation)

-- | The network ACL rule.
explanation_aclRule :: Lens.Lens' Explanation (Prelude.Maybe AnalysisAclRule)
explanation_aclRule = Lens.lens (\Explanation' {aclRule} -> aclRule) (\s@Explanation' {} a -> s {aclRule = a} :: Explanation)

-- | The IPv4 address, in CIDR notation.
explanation_address :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_address = Lens.lens (\Explanation' {address} -> address) (\s@Explanation' {} a -> s {address = a} :: Explanation)

-- | The IPv4 addresses, in CIDR notation.
explanation_addresses :: Lens.Lens' Explanation (Prelude.Maybe [Prelude.Text])
explanation_addresses = Lens.lens (\Explanation' {addresses} -> addresses) (\s@Explanation' {} a -> s {addresses = a} :: Explanation) Prelude.. Lens.mapping Lens.coerced

-- | The resource to which the component is attached.
explanation_attachedTo :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_attachedTo = Lens.lens (\Explanation' {attachedTo} -> attachedTo) (\s@Explanation' {} a -> s {attachedTo = a} :: Explanation)

-- | The Availability Zones.
explanation_availabilityZones :: Lens.Lens' Explanation (Prelude.Maybe [Prelude.Text])
explanation_availabilityZones = Lens.lens (\Explanation' {availabilityZones} -> availabilityZones) (\s@Explanation' {} a -> s {availabilityZones = a} :: Explanation) Prelude.. Lens.mapping Lens.coerced

-- | The CIDR ranges.
explanation_cidrs :: Lens.Lens' Explanation (Prelude.Maybe [Prelude.Text])
explanation_cidrs = Lens.lens (\Explanation' {cidrs} -> cidrs) (\s@Explanation' {} a -> s {cidrs = a} :: Explanation) Prelude.. Lens.mapping Lens.coerced

-- | The listener for a Classic Load Balancer.
explanation_classicLoadBalancerListener :: Lens.Lens' Explanation (Prelude.Maybe AnalysisLoadBalancerListener)
explanation_classicLoadBalancerListener = Lens.lens (\Explanation' {classicLoadBalancerListener} -> classicLoadBalancerListener) (\s@Explanation' {} a -> s {classicLoadBalancerListener = a} :: Explanation)

-- | The component.
explanation_component :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_component = Lens.lens (\Explanation' {component} -> component) (\s@Explanation' {} a -> s {component = a} :: Explanation)

-- | The Amazon Web Services account for the component.
explanation_componentAccount :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_componentAccount = Lens.lens (\Explanation' {componentAccount} -> componentAccount) (\s@Explanation' {} a -> s {componentAccount = a} :: Explanation)

-- | The Region for the component.
explanation_componentRegion :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_componentRegion = Lens.lens (\Explanation' {componentRegion} -> componentRegion) (\s@Explanation' {} a -> s {componentRegion = a} :: Explanation)

-- | The customer gateway.
explanation_customerGateway :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_customerGateway = Lens.lens (\Explanation' {customerGateway} -> customerGateway) (\s@Explanation' {} a -> s {customerGateway = a} :: Explanation)

-- | The destination.
explanation_destination :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_destination = Lens.lens (\Explanation' {destination} -> destination) (\s@Explanation' {} a -> s {destination = a} :: Explanation)

-- | The destination VPC.
explanation_destinationVpc :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_destinationVpc = Lens.lens (\Explanation' {destinationVpc} -> destinationVpc) (\s@Explanation' {} a -> s {destinationVpc = a} :: Explanation)

-- | The direction. The following are the possible values:
--
-- -   egress
--
-- -   ingress
explanation_direction :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_direction = Lens.lens (\Explanation' {direction} -> direction) (\s@Explanation' {} a -> s {direction = a} :: Explanation)

-- | The load balancer listener.
explanation_elasticLoadBalancerListener :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_elasticLoadBalancerListener = Lens.lens (\Explanation' {elasticLoadBalancerListener} -> elasticLoadBalancerListener) (\s@Explanation' {} a -> s {elasticLoadBalancerListener = a} :: Explanation)

-- | The explanation code.
explanation_explanationCode :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_explanationCode = Lens.lens (\Explanation' {explanationCode} -> explanationCode) (\s@Explanation' {} a -> s {explanationCode = a} :: Explanation)

-- | The route table.
explanation_ingressRouteTable :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_ingressRouteTable = Lens.lens (\Explanation' {ingressRouteTable} -> ingressRouteTable) (\s@Explanation' {} a -> s {ingressRouteTable = a} :: Explanation)

-- | The internet gateway.
explanation_internetGateway :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_internetGateway = Lens.lens (\Explanation' {internetGateway} -> internetGateway) (\s@Explanation' {} a -> s {internetGateway = a} :: Explanation)

-- | The Amazon Resource Name (ARN) of the load balancer.
explanation_loadBalancerArn :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_loadBalancerArn = Lens.lens (\Explanation' {loadBalancerArn} -> loadBalancerArn) (\s@Explanation' {} a -> s {loadBalancerArn = a} :: Explanation)

-- | The listener port of the load balancer.
explanation_loadBalancerListenerPort :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Natural)
explanation_loadBalancerListenerPort = Lens.lens (\Explanation' {loadBalancerListenerPort} -> loadBalancerListenerPort) (\s@Explanation' {} a -> s {loadBalancerListenerPort = a} :: Explanation)

-- | The target.
explanation_loadBalancerTarget :: Lens.Lens' Explanation (Prelude.Maybe AnalysisLoadBalancerTarget)
explanation_loadBalancerTarget = Lens.lens (\Explanation' {loadBalancerTarget} -> loadBalancerTarget) (\s@Explanation' {} a -> s {loadBalancerTarget = a} :: Explanation)

-- | The target group.
explanation_loadBalancerTargetGroup :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_loadBalancerTargetGroup = Lens.lens (\Explanation' {loadBalancerTargetGroup} -> loadBalancerTargetGroup) (\s@Explanation' {} a -> s {loadBalancerTargetGroup = a} :: Explanation)

-- | The target groups.
explanation_loadBalancerTargetGroups :: Lens.Lens' Explanation (Prelude.Maybe [AnalysisComponent])
explanation_loadBalancerTargetGroups = Lens.lens (\Explanation' {loadBalancerTargetGroups} -> loadBalancerTargetGroups) (\s@Explanation' {} a -> s {loadBalancerTargetGroups = a} :: Explanation) Prelude.. Lens.mapping Lens.coerced

-- | The target port.
explanation_loadBalancerTargetPort :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Natural)
explanation_loadBalancerTargetPort = Lens.lens (\Explanation' {loadBalancerTargetPort} -> loadBalancerTargetPort) (\s@Explanation' {} a -> s {loadBalancerTargetPort = a} :: Explanation)

-- | The missing component.
explanation_missingComponent :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_missingComponent = Lens.lens (\Explanation' {missingComponent} -> missingComponent) (\s@Explanation' {} a -> s {missingComponent = a} :: Explanation)

-- | The NAT gateway.
explanation_natGateway :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_natGateway = Lens.lens (\Explanation' {natGateway} -> natGateway) (\s@Explanation' {} a -> s {natGateway = a} :: Explanation)

-- | The network interface.
explanation_networkInterface :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_networkInterface = Lens.lens (\Explanation' {networkInterface} -> networkInterface) (\s@Explanation' {} a -> s {networkInterface = a} :: Explanation)

-- | The packet field.
explanation_packetField :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_packetField = Lens.lens (\Explanation' {packetField} -> packetField) (\s@Explanation' {} a -> s {packetField = a} :: Explanation)

-- | The port.
explanation_port :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Natural)
explanation_port = Lens.lens (\Explanation' {port} -> port) (\s@Explanation' {} a -> s {port = a} :: Explanation)

-- | The port ranges.
explanation_portRanges :: Lens.Lens' Explanation (Prelude.Maybe [PortRange])
explanation_portRanges = Lens.lens (\Explanation' {portRanges} -> portRanges) (\s@Explanation' {} a -> s {portRanges = a} :: Explanation) Prelude.. Lens.mapping Lens.coerced

-- | The prefix list.
explanation_prefixList :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_prefixList = Lens.lens (\Explanation' {prefixList} -> prefixList) (\s@Explanation' {} a -> s {prefixList = a} :: Explanation)

-- | The protocols.
explanation_protocols :: Lens.Lens' Explanation (Prelude.Maybe [Prelude.Text])
explanation_protocols = Lens.lens (\Explanation' {protocols} -> protocols) (\s@Explanation' {} a -> s {protocols = a} :: Explanation) Prelude.. Lens.mapping Lens.coerced

-- | The route table.
explanation_routeTable :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_routeTable = Lens.lens (\Explanation' {routeTable} -> routeTable) (\s@Explanation' {} a -> s {routeTable = a} :: Explanation)

-- | The route table route.
explanation_routeTableRoute :: Lens.Lens' Explanation (Prelude.Maybe AnalysisRouteTableRoute)
explanation_routeTableRoute = Lens.lens (\Explanation' {routeTableRoute} -> routeTableRoute) (\s@Explanation' {} a -> s {routeTableRoute = a} :: Explanation)

-- | The security group.
explanation_securityGroup :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_securityGroup = Lens.lens (\Explanation' {securityGroup} -> securityGroup) (\s@Explanation' {} a -> s {securityGroup = a} :: Explanation)

-- | The security group rule.
explanation_securityGroupRule :: Lens.Lens' Explanation (Prelude.Maybe AnalysisSecurityGroupRule)
explanation_securityGroupRule = Lens.lens (\Explanation' {securityGroupRule} -> securityGroupRule) (\s@Explanation' {} a -> s {securityGroupRule = a} :: Explanation)

-- | The security groups.
explanation_securityGroups :: Lens.Lens' Explanation (Prelude.Maybe [AnalysisComponent])
explanation_securityGroups = Lens.lens (\Explanation' {securityGroups} -> securityGroups) (\s@Explanation' {} a -> s {securityGroups = a} :: Explanation) Prelude.. Lens.mapping Lens.coerced

-- | The source VPC.
explanation_sourceVpc :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_sourceVpc = Lens.lens (\Explanation' {sourceVpc} -> sourceVpc) (\s@Explanation' {} a -> s {sourceVpc = a} :: Explanation)

-- | The state.
explanation_state :: Lens.Lens' Explanation (Prelude.Maybe Prelude.Text)
explanation_state = Lens.lens (\Explanation' {state} -> state) (\s@Explanation' {} a -> s {state = a} :: Explanation)

-- | The subnet.
explanation_subnet :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_subnet = Lens.lens (\Explanation' {subnet} -> subnet) (\s@Explanation' {} a -> s {subnet = a} :: Explanation)

-- | The route table for the subnet.
explanation_subnetRouteTable :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_subnetRouteTable = Lens.lens (\Explanation' {subnetRouteTable} -> subnetRouteTable) (\s@Explanation' {} a -> s {subnetRouteTable = a} :: Explanation)

-- | The transit gateway.
explanation_transitGateway :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_transitGateway = Lens.lens (\Explanation' {transitGateway} -> transitGateway) (\s@Explanation' {} a -> s {transitGateway = a} :: Explanation)

-- | The transit gateway attachment.
explanation_transitGatewayAttachment :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_transitGatewayAttachment = Lens.lens (\Explanation' {transitGatewayAttachment} -> transitGatewayAttachment) (\s@Explanation' {} a -> s {transitGatewayAttachment = a} :: Explanation)

-- | The transit gateway route table.
explanation_transitGatewayRouteTable :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_transitGatewayRouteTable = Lens.lens (\Explanation' {transitGatewayRouteTable} -> transitGatewayRouteTable) (\s@Explanation' {} a -> s {transitGatewayRouteTable = a} :: Explanation)

-- | The transit gateway route table route.
explanation_transitGatewayRouteTableRoute :: Lens.Lens' Explanation (Prelude.Maybe TransitGatewayRouteTableRoute)
explanation_transitGatewayRouteTableRoute = Lens.lens (\Explanation' {transitGatewayRouteTableRoute} -> transitGatewayRouteTableRoute) (\s@Explanation' {} a -> s {transitGatewayRouteTableRoute = a} :: Explanation)

-- | The component VPC.
explanation_vpc :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_vpc = Lens.lens (\Explanation' {vpc} -> vpc) (\s@Explanation' {} a -> s {vpc = a} :: Explanation)

-- | The VPC endpoint.
explanation_vpcEndpoint :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_vpcEndpoint = Lens.lens (\Explanation' {vpcEndpoint} -> vpcEndpoint) (\s@Explanation' {} a -> s {vpcEndpoint = a} :: Explanation)

-- | The VPC peering connection.
explanation_vpcPeeringConnection :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_vpcPeeringConnection = Lens.lens (\Explanation' {vpcPeeringConnection} -> vpcPeeringConnection) (\s@Explanation' {} a -> s {vpcPeeringConnection = a} :: Explanation)

-- | The VPN connection.
explanation_vpnConnection :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_vpnConnection = Lens.lens (\Explanation' {vpnConnection} -> vpnConnection) (\s@Explanation' {} a -> s {vpnConnection = a} :: Explanation)

-- | The VPN gateway.
explanation_vpnGateway :: Lens.Lens' Explanation (Prelude.Maybe AnalysisComponent)
explanation_vpnGateway = Lens.lens (\Explanation' {vpnGateway} -> vpnGateway) (\s@Explanation' {} a -> s {vpnGateway = a} :: Explanation)

instance Data.FromXML Explanation where
  parseXML x =
    Explanation'
      Prelude.<$> (x Data..@? "acl")
      Prelude.<*> (x Data..@? "aclRule")
      Prelude.<*> (x Data..@? "address")
      Prelude.<*> ( x
                      Data..@? "addressSet"
                      Core..!@ Prelude.mempty
                      Prelude.>>= Core.may (Data.parseXMLList "item")
                  )
      Prelude.<*> (x Data..@? "attachedTo")
      Prelude.<*> ( x
                      Data..@? "availabilityZoneSet"
                      Core..!@ Prelude.mempty
                      Prelude.>>= Core.may (Data.parseXMLList "item")
                  )
      Prelude.<*> ( x
                      Data..@? "cidrSet"
                      Core..!@ Prelude.mempty
                      Prelude.>>= Core.may (Data.parseXMLList "item")
                  )
      Prelude.<*> (x Data..@? "classicLoadBalancerListener")
      Prelude.<*> (x Data..@? "component")
      Prelude.<*> (x Data..@? "componentAccount")
      Prelude.<*> (x Data..@? "componentRegion")
      Prelude.<*> (x Data..@? "customerGateway")
      Prelude.<*> (x Data..@? "destination")
      Prelude.<*> (x Data..@? "destinationVpc")
      Prelude.<*> (x Data..@? "direction")
      Prelude.<*> (x Data..@? "elasticLoadBalancerListener")
      Prelude.<*> (x Data..@? "explanationCode")
      Prelude.<*> (x Data..@? "ingressRouteTable")
      Prelude.<*> (x Data..@? "internetGateway")
      Prelude.<*> (x Data..@? "loadBalancerArn")
      Prelude.<*> (x Data..@? "loadBalancerListenerPort")
      Prelude.<*> (x Data..@? "loadBalancerTarget")
      Prelude.<*> (x Data..@? "loadBalancerTargetGroup")
      Prelude.<*> ( x
                      Data..@? "loadBalancerTargetGroupSet"
                      Core..!@ Prelude.mempty
                      Prelude.>>= Core.may (Data.parseXMLList "item")
                  )
      Prelude.<*> (x Data..@? "loadBalancerTargetPort")
      Prelude.<*> (x Data..@? "missingComponent")
      Prelude.<*> (x Data..@? "natGateway")
      Prelude.<*> (x Data..@? "networkInterface")
      Prelude.<*> (x Data..@? "packetField")
      Prelude.<*> (x Data..@? "port")
      Prelude.<*> ( x
                      Data..@? "portRangeSet"
                      Core..!@ Prelude.mempty
                      Prelude.>>= Core.may (Data.parseXMLList "item")
                  )
      Prelude.<*> (x Data..@? "prefixList")
      Prelude.<*> ( x
                      Data..@? "protocolSet"
                      Core..!@ Prelude.mempty
                      Prelude.>>= Core.may (Data.parseXMLList "item")
                  )
      Prelude.<*> (x Data..@? "routeTable")
      Prelude.<*> (x Data..@? "routeTableRoute")
      Prelude.<*> (x Data..@? "securityGroup")
      Prelude.<*> (x Data..@? "securityGroupRule")
      Prelude.<*> ( x
                      Data..@? "securityGroupSet"
                      Core..!@ Prelude.mempty
                      Prelude.>>= Core.may (Data.parseXMLList "item")
                  )
      Prelude.<*> (x Data..@? "sourceVpc")
      Prelude.<*> (x Data..@? "state")
      Prelude.<*> (x Data..@? "subnet")
      Prelude.<*> (x Data..@? "subnetRouteTable")
      Prelude.<*> (x Data..@? "transitGateway")
      Prelude.<*> (x Data..@? "transitGatewayAttachment")
      Prelude.<*> (x Data..@? "transitGatewayRouteTable")
      Prelude.<*> (x Data..@? "transitGatewayRouteTableRoute")
      Prelude.<*> (x Data..@? "vpc")
      Prelude.<*> (x Data..@? "vpcEndpoint")
      Prelude.<*> (x Data..@? "vpcPeeringConnection")
      Prelude.<*> (x Data..@? "vpnConnection")
      Prelude.<*> (x Data..@? "vpnGateway")

instance Prelude.Hashable Explanation where
  hashWithSalt _salt Explanation' {..} =
    _salt
      `Prelude.hashWithSalt` acl
      `Prelude.hashWithSalt` aclRule
      `Prelude.hashWithSalt` address
      `Prelude.hashWithSalt` addresses
      `Prelude.hashWithSalt` attachedTo
      `Prelude.hashWithSalt` availabilityZones
      `Prelude.hashWithSalt` cidrs
      `Prelude.hashWithSalt` classicLoadBalancerListener
      `Prelude.hashWithSalt` component
      `Prelude.hashWithSalt` componentAccount
      `Prelude.hashWithSalt` componentRegion
      `Prelude.hashWithSalt` customerGateway
      `Prelude.hashWithSalt` destination
      `Prelude.hashWithSalt` destinationVpc
      `Prelude.hashWithSalt` direction
      `Prelude.hashWithSalt` elasticLoadBalancerListener
      `Prelude.hashWithSalt` explanationCode
      `Prelude.hashWithSalt` ingressRouteTable
      `Prelude.hashWithSalt` internetGateway
      `Prelude.hashWithSalt` loadBalancerArn
      `Prelude.hashWithSalt` loadBalancerListenerPort
      `Prelude.hashWithSalt` loadBalancerTarget
      `Prelude.hashWithSalt` loadBalancerTargetGroup
      `Prelude.hashWithSalt` loadBalancerTargetGroups
      `Prelude.hashWithSalt` loadBalancerTargetPort
      `Prelude.hashWithSalt` missingComponent
      `Prelude.hashWithSalt` natGateway
      `Prelude.hashWithSalt` networkInterface
      `Prelude.hashWithSalt` packetField
      `Prelude.hashWithSalt` port
      `Prelude.hashWithSalt` portRanges
      `Prelude.hashWithSalt` prefixList
      `Prelude.hashWithSalt` protocols
      `Prelude.hashWithSalt` routeTable
      `Prelude.hashWithSalt` routeTableRoute
      `Prelude.hashWithSalt` securityGroup
      `Prelude.hashWithSalt` securityGroupRule
      `Prelude.hashWithSalt` securityGroups
      `Prelude.hashWithSalt` sourceVpc
      `Prelude.hashWithSalt` state
      `Prelude.hashWithSalt` subnet
      `Prelude.hashWithSalt` subnetRouteTable
      `Prelude.hashWithSalt` transitGateway
      `Prelude.hashWithSalt` transitGatewayAttachment
      `Prelude.hashWithSalt` transitGatewayRouteTable
      `Prelude.hashWithSalt` transitGatewayRouteTableRoute
      `Prelude.hashWithSalt` vpc
      `Prelude.hashWithSalt` vpcEndpoint
      `Prelude.hashWithSalt` vpcPeeringConnection
      `Prelude.hashWithSalt` vpnConnection
      `Prelude.hashWithSalt` vpnGateway

instance Prelude.NFData Explanation where
  rnf Explanation' {..} =
    Prelude.rnf acl
      `Prelude.seq` Prelude.rnf aclRule
      `Prelude.seq` Prelude.rnf address
      `Prelude.seq` Prelude.rnf addresses
      `Prelude.seq` Prelude.rnf attachedTo
      `Prelude.seq` Prelude.rnf availabilityZones
      `Prelude.seq` Prelude.rnf cidrs
      `Prelude.seq` Prelude.rnf classicLoadBalancerListener
      `Prelude.seq` Prelude.rnf component
      `Prelude.seq` Prelude.rnf componentAccount
      `Prelude.seq` Prelude.rnf componentRegion
      `Prelude.seq` Prelude.rnf customerGateway
      `Prelude.seq` Prelude.rnf destination
      `Prelude.seq` Prelude.rnf destinationVpc
      `Prelude.seq` Prelude.rnf direction
      `Prelude.seq` Prelude.rnf
        elasticLoadBalancerListener
      `Prelude.seq` Prelude.rnf explanationCode
      `Prelude.seq` Prelude.rnf ingressRouteTable
      `Prelude.seq` Prelude.rnf internetGateway
      `Prelude.seq` Prelude.rnf loadBalancerArn
      `Prelude.seq` Prelude.rnf
        loadBalancerListenerPort
      `Prelude.seq` Prelude.rnf
        loadBalancerTarget
      `Prelude.seq` Prelude.rnf
        loadBalancerTargetGroup
      `Prelude.seq` Prelude.rnf
        loadBalancerTargetGroups
      `Prelude.seq` Prelude.rnf
        loadBalancerTargetPort
      `Prelude.seq` Prelude.rnf
        missingComponent
      `Prelude.seq` Prelude.rnf
        natGateway
      `Prelude.seq` Prelude.rnf
        networkInterface
      `Prelude.seq` Prelude.rnf
        packetField
      `Prelude.seq` Prelude.rnf
        port
      `Prelude.seq` Prelude.rnf
        portRanges
      `Prelude.seq` Prelude.rnf
        prefixList
      `Prelude.seq` Prelude.rnf
        protocols
      `Prelude.seq` Prelude.rnf
        routeTable
      `Prelude.seq` Prelude.rnf
        routeTableRoute
      `Prelude.seq` Prelude.rnf
        securityGroup
      `Prelude.seq` Prelude.rnf
        securityGroupRule
      `Prelude.seq` Prelude.rnf
        securityGroups
      `Prelude.seq` Prelude.rnf
        sourceVpc
      `Prelude.seq` Prelude.rnf
        state
      `Prelude.seq` Prelude.rnf
        subnet
      `Prelude.seq` Prelude.rnf
        subnetRouteTable
      `Prelude.seq` Prelude.rnf
        transitGateway
      `Prelude.seq` Prelude.rnf
        transitGatewayAttachment
      `Prelude.seq` Prelude.rnf
        transitGatewayRouteTable
      `Prelude.seq` Prelude.rnf
        transitGatewayRouteTableRoute
      `Prelude.seq` Prelude.rnf
        vpc
      `Prelude.seq` Prelude.rnf
        vpcEndpoint
      `Prelude.seq` Prelude.rnf
        vpcPeeringConnection
      `Prelude.seq` Prelude.rnf
        vpnConnection
      `Prelude.seq` Prelude.rnf
        vpnGateway