packages feed

amazonka-resourcegroups-2.0: gen/Amazonka/ResourceGroups/Types/ResourceQuery.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.ResourceGroups.Types.ResourceQuery
-- 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.ResourceGroups.Types.ResourceQuery where

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
import Amazonka.ResourceGroups.Types.QueryType

-- | The query that is used to define a resource group or a search for
-- resources. A query specifies both a query type and a query string as a
-- JSON object. See the examples section for example JSON strings.
--
-- The examples that follow are shown as standard JSON strings. If you
-- include such a string as a parameter to the AWS CLI or an SDK API, you
-- might need to \'escape\' the string into a single line. For example, see
-- the
-- <https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-quoting-strings.html Quoting strings>
-- in the /AWS CLI User Guide/.
--
-- __Example 1__
--
-- The following generic example shows a resource query JSON string that
-- includes only resources that meet the following criteria:
--
-- -   The resource type must be either @resource_type1@ or
--     @resource_type2@.
--
-- -   The resource must have a tag @Key1@ with a value of either @ValueA@
--     or @ValueB@.
--
-- -   The resource must have a tag @Key2@ with a value of either @ValueC@
--     or @ValueD@.
--
-- @{ \"Type\": \"TAG_FILTERS_1_0\", \"Query\": { \"ResourceTypeFilters\": [ \"resource_type1\", \"resource_type2\"], \"TagFilters\": [ { \"Key\": \"Key1\", \"Values\": [\"ValueA\",\"ValueB\"] }, { \"Key\":\"Key2\", \"Values\":[\"ValueC\",\"ValueD\"] } ] } }@
--
-- This has the equivalent \"shortcut\" syntax of the following:
--
-- @{ \"Type\": \"TAG_FILTERS_1_0\", \"Query\": { \"ResourceTypeFilters\": [ \"resource_type1\", \"resource_type2\"], \"TagFilters\": [ { \"Key1\": [\"ValueA\",\"ValueB\"] }, { \"Key2\": [\"ValueC\",\"ValueD\"] } ] } }@
--
-- __Example 2__
--
-- The following example shows a resource query JSON string that includes
-- only Amazon EC2 instances that are tagged @Stage@ with a value of
-- @Test@.
--
-- @{ \"Type\": \"TAG_FILTERS_1_0\", \"Query\": \"{ \"ResourceTypeFilters\": \"AWS::EC2::Instance\", \"TagFilters\": { \"Stage\": \"Test\" } } }@
--
-- __Example 3__
--
-- The following example shows a resource query JSON string that includes
-- resource of any supported type as long as it is tagged @Stage@ with a
-- value of @Prod@.
--
-- @{ \"Type\": \"TAG_FILTERS_1_0\", \"Query\": { \"ResourceTypeFilters\": \"AWS::AllSupported\", \"TagFilters\": { \"Stage\": \"Prod\" } } }@
--
-- __Example 4__
--
-- The following example shows a resource query JSON string that includes
-- only Amazon EC2 instances and Amazon S3 buckets that are part of the
-- specified AWS CloudFormation stack.
--
-- @{ \"Type\": \"CLOUDFORMATION_STACK_1_0\", \"Query\": { \"ResourceTypeFilters\": [ \"AWS::EC2::Instance\", \"AWS::S3::Bucket\" ], \"StackIdentifier\": \"arn:aws:cloudformation:us-west-2:123456789012:stack\/AWStestuseraccount\/fb0d5000-aba8-00e8-aa9e-50d5cEXAMPLE\" } }@
--
-- /See:/ 'newResourceQuery' smart constructor.
data ResourceQuery = ResourceQuery'
  { -- | The type of the query. You can use the following values:
    --
    -- -   /@CLOUDFORMATION_STACK_1_0:@/ Specifies that the @Query@ contains an
    --     ARN for a CloudFormation stack.
    --
    -- -   /@TAG_FILTERS_1_0:@/ Specifies that the @Query@ parameter contains a
    --     JSON string that represents a collection of simple tag filters for
    --     resource types and tags. The JSON string uses a syntax similar to
    --     the
    --     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html GetResources>@ @
    --     operation, but uses only the
    --     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html#resourcegrouptagging-GetResources-request-ResourceTypeFilters ResourceTypeFilters>@ @
    --     and
    --     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html#resourcegrouptagging-GetResources-request-TagFiltersTagFilters TagFilters>@ @
    --     fields. If you specify more than one tag key, only resources that
    --     match all tag keys, and at least one value of each specified tag
    --     key, are returned in your query. If you specify more than one value
    --     for a tag key, a resource matches the filter if it has a tag key
    --     value that matches /any/ of the specified values.
    --
    --     For example, consider the following sample query for resources that
    --     have two tags, @Stage@ and @Version@, with two values each:
    --
    --     @[{\"Stage\":[\"Test\",\"Deploy\"]},{\"Version\":[\"1\",\"2\"]}]@
    --
    --     The results of this query could include the following.
    --
    --     -   An EC2 instance that has the following two tags:
    --         @{\"Stage\":\"Deploy\"}@, and @{\"Version\":\"2\"}@
    --
    --     -   An S3 bucket that has the following two tags:
    --         @{\"Stage\":\"Test\"}@, and @{\"Version\":\"1\"}@
    --
    --     The query would not include the following items in the results,
    --     however.
    --
    --     -   An EC2 instance that has only the following tag:
    --         @{\"Stage\":\"Deploy\"}@.
    --
    --         The instance does not have __all__ of the tag keys specified in
    --         the filter, so it is excluded from the results.
    --
    --     -   An RDS database that has the following two tags:
    --         @{\"Stage\":\"Archived\"}@ and @{\"Version\":\"4\"}@
    --
    --         The database has all of the tag keys, but none of those keys has
    --         an associated value that matches at least one of the specified
    --         values in the filter.
    type' :: QueryType,
    -- | The query that defines a group or a search.
    query :: Prelude.Text
  }
  deriving (Prelude.Eq, Prelude.Read, Prelude.Show, Prelude.Generic)

-- |
-- Create a value of 'ResourceQuery' 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:
--
-- 'type'', 'resourceQuery_type' - The type of the query. You can use the following values:
--
-- -   /@CLOUDFORMATION_STACK_1_0:@/ Specifies that the @Query@ contains an
--     ARN for a CloudFormation stack.
--
-- -   /@TAG_FILTERS_1_0:@/ Specifies that the @Query@ parameter contains a
--     JSON string that represents a collection of simple tag filters for
--     resource types and tags. The JSON string uses a syntax similar to
--     the
--     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html GetResources>@ @
--     operation, but uses only the
--     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html#resourcegrouptagging-GetResources-request-ResourceTypeFilters ResourceTypeFilters>@ @
--     and
--     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html#resourcegrouptagging-GetResources-request-TagFiltersTagFilters TagFilters>@ @
--     fields. If you specify more than one tag key, only resources that
--     match all tag keys, and at least one value of each specified tag
--     key, are returned in your query. If you specify more than one value
--     for a tag key, a resource matches the filter if it has a tag key
--     value that matches /any/ of the specified values.
--
--     For example, consider the following sample query for resources that
--     have two tags, @Stage@ and @Version@, with two values each:
--
--     @[{\"Stage\":[\"Test\",\"Deploy\"]},{\"Version\":[\"1\",\"2\"]}]@
--
--     The results of this query could include the following.
--
--     -   An EC2 instance that has the following two tags:
--         @{\"Stage\":\"Deploy\"}@, and @{\"Version\":\"2\"}@
--
--     -   An S3 bucket that has the following two tags:
--         @{\"Stage\":\"Test\"}@, and @{\"Version\":\"1\"}@
--
--     The query would not include the following items in the results,
--     however.
--
--     -   An EC2 instance that has only the following tag:
--         @{\"Stage\":\"Deploy\"}@.
--
--         The instance does not have __all__ of the tag keys specified in
--         the filter, so it is excluded from the results.
--
--     -   An RDS database that has the following two tags:
--         @{\"Stage\":\"Archived\"}@ and @{\"Version\":\"4\"}@
--
--         The database has all of the tag keys, but none of those keys has
--         an associated value that matches at least one of the specified
--         values in the filter.
--
-- 'query', 'resourceQuery_searchQuery' - The query that defines a group or a search.
newResourceQuery ::
  -- | 'type''
  QueryType ->
  -- | 'query'
  Prelude.Text ->
  ResourceQuery
newResourceQuery pType_ pSearchQuery_ =
  ResourceQuery'
    { type' = pType_,
      query = pSearchQuery_
    }

-- | The type of the query. You can use the following values:
--
-- -   /@CLOUDFORMATION_STACK_1_0:@/ Specifies that the @Query@ contains an
--     ARN for a CloudFormation stack.
--
-- -   /@TAG_FILTERS_1_0:@/ Specifies that the @Query@ parameter contains a
--     JSON string that represents a collection of simple tag filters for
--     resource types and tags. The JSON string uses a syntax similar to
--     the
--     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html GetResources>@ @
--     operation, but uses only the
--     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html#resourcegrouptagging-GetResources-request-ResourceTypeFilters ResourceTypeFilters>@ @
--     and
--     @ @<https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html#resourcegrouptagging-GetResources-request-TagFiltersTagFilters TagFilters>@ @
--     fields. If you specify more than one tag key, only resources that
--     match all tag keys, and at least one value of each specified tag
--     key, are returned in your query. If you specify more than one value
--     for a tag key, a resource matches the filter if it has a tag key
--     value that matches /any/ of the specified values.
--
--     For example, consider the following sample query for resources that
--     have two tags, @Stage@ and @Version@, with two values each:
--
--     @[{\"Stage\":[\"Test\",\"Deploy\"]},{\"Version\":[\"1\",\"2\"]}]@
--
--     The results of this query could include the following.
--
--     -   An EC2 instance that has the following two tags:
--         @{\"Stage\":\"Deploy\"}@, and @{\"Version\":\"2\"}@
--
--     -   An S3 bucket that has the following two tags:
--         @{\"Stage\":\"Test\"}@, and @{\"Version\":\"1\"}@
--
--     The query would not include the following items in the results,
--     however.
--
--     -   An EC2 instance that has only the following tag:
--         @{\"Stage\":\"Deploy\"}@.
--
--         The instance does not have __all__ of the tag keys specified in
--         the filter, so it is excluded from the results.
--
--     -   An RDS database that has the following two tags:
--         @{\"Stage\":\"Archived\"}@ and @{\"Version\":\"4\"}@
--
--         The database has all of the tag keys, but none of those keys has
--         an associated value that matches at least one of the specified
--         values in the filter.
resourceQuery_type :: Lens.Lens' ResourceQuery QueryType
resourceQuery_type = Lens.lens (\ResourceQuery' {type'} -> type') (\s@ResourceQuery' {} a -> s {type' = a} :: ResourceQuery)

-- | The query that defines a group or a search.
resourceQuery_searchQuery :: Lens.Lens' ResourceQuery Prelude.Text
resourceQuery_searchQuery = Lens.lens (\ResourceQuery' {query} -> query) (\s@ResourceQuery' {} a -> s {query = a} :: ResourceQuery)

instance Data.FromJSON ResourceQuery where
  parseJSON =
    Data.withObject
      "ResourceQuery"
      ( \x ->
          ResourceQuery'
            Prelude.<$> (x Data..: "Type")
            Prelude.<*> (x Data..: "Query")
      )

instance Prelude.Hashable ResourceQuery where
  hashWithSalt _salt ResourceQuery' {..} =
    _salt
      `Prelude.hashWithSalt` type'
      `Prelude.hashWithSalt` query

instance Prelude.NFData ResourceQuery where
  rnf ResourceQuery' {..} =
    Prelude.rnf type' `Prelude.seq` Prelude.rnf query

instance Data.ToJSON ResourceQuery where
  toJSON ResourceQuery' {..} =
    Data.object
      ( Prelude.catMaybes
          [ Prelude.Just ("Type" Data..= type'),
            Prelude.Just ("Query" Data..= query)
          ]
      )