{-# 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.SSM.Types.CommandFilter
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.SSM.Types.CommandFilter where

import qualified Amazonka.Core as Core
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude
import Amazonka.SSM.Types.CommandFilterKey

-- | Describes a command filter.
--
-- An instance ID can\'t be specified when a command status is @Pending@
-- because the command hasn\'t run on the instance yet.
--
-- /See:/ 'newCommandFilter' smart constructor.
data CommandFilter = CommandFilter'
  { -- | The name of the filter.
    CommandFilter -> CommandFilterKey
key :: CommandFilterKey,
    -- | The filter value. Valid values for each filter key are as follows:
    --
    -- -   __InvokedAfter__: Specify a timestamp to limit your results. For
    --     example, specify @2021-07-07T00:00:00Z@ to see a list of command
    --     executions occurring July 7, 2021, and later.
    --
    -- -   __InvokedBefore__: Specify a timestamp to limit your results. For
    --     example, specify @2021-07-07T00:00:00Z@ to see a list of command
    --     executions from before July 7, 2021.
    --
    -- -   __Status__: Specify a valid command status to see a list of all
    --     command executions with that status. The status choices depend on
    --     the API you call.
    --
    --     The status values you can specify for @ListCommands@ are:
    --
    --     -   @Pending@
    --
    --     -   @InProgress@
    --
    --     -   @Success@
    --
    --     -   @Cancelled@
    --
    --     -   @Failed@
    --
    --     -   @TimedOut@ (this includes both Delivery and Execution time outs)
    --
    --     -   @AccessDenied@
    --
    --     -   @DeliveryTimedOut@
    --
    --     -   @ExecutionTimedOut@
    --
    --     -   @Incomplete@
    --
    --     -   @NoInstancesInTag@
    --
    --     -   @LimitExceeded@
    --
    --     The status values you can specify for @ListCommandInvocations@ are:
    --
    --     -   @Pending@
    --
    --     -   @InProgress@
    --
    --     -   @Delayed@
    --
    --     -   @Success@
    --
    --     -   @Cancelled@
    --
    --     -   @Failed@
    --
    --     -   @TimedOut@ (this includes both Delivery and Execution time outs)
    --
    --     -   @AccessDenied@
    --
    --     -   @DeliveryTimedOut@
    --
    --     -   @ExecutionTimedOut@
    --
    --     -   @Undeliverable@
    --
    --     -   @InvalidPlatform@
    --
    --     -   @Terminated@
    --
    -- -   __DocumentName__: Specify name of the Amazon Web Services Systems
    --     Manager document (SSM document) for which you want to see command
    --     execution results. For example, specify @AWS-RunPatchBaseline@ to
    --     see command executions that used this SSM document to perform
    --     security patching operations on instances.
    --
    -- -   __ExecutionStage__: Specify one of the following values:
    --
    --     -   @Executing@: Returns a list of command executions that are
    --         currently still running.
    --
    --     -   @Complete@: Returns a list of command executions that have
    --         already completed.
    CommandFilter -> Text
value :: Prelude.Text
  }
  deriving (CommandFilter -> CommandFilter -> Bool
(CommandFilter -> CommandFilter -> Bool)
-> (CommandFilter -> CommandFilter -> Bool) -> Eq CommandFilter
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CommandFilter -> CommandFilter -> Bool
$c/= :: CommandFilter -> CommandFilter -> Bool
== :: CommandFilter -> CommandFilter -> Bool
$c== :: CommandFilter -> CommandFilter -> Bool
Prelude.Eq, ReadPrec [CommandFilter]
ReadPrec CommandFilter
Int -> ReadS CommandFilter
ReadS [CommandFilter]
(Int -> ReadS CommandFilter)
-> ReadS [CommandFilter]
-> ReadPrec CommandFilter
-> ReadPrec [CommandFilter]
-> Read CommandFilter
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CommandFilter]
$creadListPrec :: ReadPrec [CommandFilter]
readPrec :: ReadPrec CommandFilter
$creadPrec :: ReadPrec CommandFilter
readList :: ReadS [CommandFilter]
$creadList :: ReadS [CommandFilter]
readsPrec :: Int -> ReadS CommandFilter
$creadsPrec :: Int -> ReadS CommandFilter
Prelude.Read, Int -> CommandFilter -> ShowS
[CommandFilter] -> ShowS
CommandFilter -> String
(Int -> CommandFilter -> ShowS)
-> (CommandFilter -> String)
-> ([CommandFilter] -> ShowS)
-> Show CommandFilter
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CommandFilter] -> ShowS
$cshowList :: [CommandFilter] -> ShowS
show :: CommandFilter -> String
$cshow :: CommandFilter -> String
showsPrec :: Int -> CommandFilter -> ShowS
$cshowsPrec :: Int -> CommandFilter -> ShowS
Prelude.Show, (forall x. CommandFilter -> Rep CommandFilter x)
-> (forall x. Rep CommandFilter x -> CommandFilter)
-> Generic CommandFilter
forall x. Rep CommandFilter x -> CommandFilter
forall x. CommandFilter -> Rep CommandFilter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CommandFilter x -> CommandFilter
$cfrom :: forall x. CommandFilter -> Rep CommandFilter x
Prelude.Generic)

-- |
-- Create a value of 'CommandFilter' 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:
--
-- 'key', 'commandFilter_key' - The name of the filter.
--
-- 'value', 'commandFilter_value' - The filter value. Valid values for each filter key are as follows:
--
-- -   __InvokedAfter__: Specify a timestamp to limit your results. For
--     example, specify @2021-07-07T00:00:00Z@ to see a list of command
--     executions occurring July 7, 2021, and later.
--
-- -   __InvokedBefore__: Specify a timestamp to limit your results. For
--     example, specify @2021-07-07T00:00:00Z@ to see a list of command
--     executions from before July 7, 2021.
--
-- -   __Status__: Specify a valid command status to see a list of all
--     command executions with that status. The status choices depend on
--     the API you call.
--
--     The status values you can specify for @ListCommands@ are:
--
--     -   @Pending@
--
--     -   @InProgress@
--
--     -   @Success@
--
--     -   @Cancelled@
--
--     -   @Failed@
--
--     -   @TimedOut@ (this includes both Delivery and Execution time outs)
--
--     -   @AccessDenied@
--
--     -   @DeliveryTimedOut@
--
--     -   @ExecutionTimedOut@
--
--     -   @Incomplete@
--
--     -   @NoInstancesInTag@
--
--     -   @LimitExceeded@
--
--     The status values you can specify for @ListCommandInvocations@ are:
--
--     -   @Pending@
--
--     -   @InProgress@
--
--     -   @Delayed@
--
--     -   @Success@
--
--     -   @Cancelled@
--
--     -   @Failed@
--
--     -   @TimedOut@ (this includes both Delivery and Execution time outs)
--
--     -   @AccessDenied@
--
--     -   @DeliveryTimedOut@
--
--     -   @ExecutionTimedOut@
--
--     -   @Undeliverable@
--
--     -   @InvalidPlatform@
--
--     -   @Terminated@
--
-- -   __DocumentName__: Specify name of the Amazon Web Services Systems
--     Manager document (SSM document) for which you want to see command
--     execution results. For example, specify @AWS-RunPatchBaseline@ to
--     see command executions that used this SSM document to perform
--     security patching operations on instances.
--
-- -   __ExecutionStage__: Specify one of the following values:
--
--     -   @Executing@: Returns a list of command executions that are
--         currently still running.
--
--     -   @Complete@: Returns a list of command executions that have
--         already completed.
newCommandFilter ::
  -- | 'key'
  CommandFilterKey ->
  -- | 'value'
  Prelude.Text ->
  CommandFilter
newCommandFilter :: CommandFilterKey -> Text -> CommandFilter
newCommandFilter CommandFilterKey
pKey_ Text
pValue_ =
  CommandFilter' :: CommandFilterKey -> Text -> CommandFilter
CommandFilter' {$sel:key:CommandFilter' :: CommandFilterKey
key = CommandFilterKey
pKey_, $sel:value:CommandFilter' :: Text
value = Text
pValue_}

-- | The name of the filter.
commandFilter_key :: Lens.Lens' CommandFilter CommandFilterKey
commandFilter_key :: (CommandFilterKey -> f CommandFilterKey)
-> CommandFilter -> f CommandFilter
commandFilter_key = (CommandFilter -> CommandFilterKey)
-> (CommandFilter -> CommandFilterKey -> CommandFilter)
-> Lens
     CommandFilter CommandFilter CommandFilterKey CommandFilterKey
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CommandFilter' {CommandFilterKey
key :: CommandFilterKey
$sel:key:CommandFilter' :: CommandFilter -> CommandFilterKey
key} -> CommandFilterKey
key) (\s :: CommandFilter
s@CommandFilter' {} CommandFilterKey
a -> CommandFilter
s {$sel:key:CommandFilter' :: CommandFilterKey
key = CommandFilterKey
a} :: CommandFilter)

-- | The filter value. Valid values for each filter key are as follows:
--
-- -   __InvokedAfter__: Specify a timestamp to limit your results. For
--     example, specify @2021-07-07T00:00:00Z@ to see a list of command
--     executions occurring July 7, 2021, and later.
--
-- -   __InvokedBefore__: Specify a timestamp to limit your results. For
--     example, specify @2021-07-07T00:00:00Z@ to see a list of command
--     executions from before July 7, 2021.
--
-- -   __Status__: Specify a valid command status to see a list of all
--     command executions with that status. The status choices depend on
--     the API you call.
--
--     The status values you can specify for @ListCommands@ are:
--
--     -   @Pending@
--
--     -   @InProgress@
--
--     -   @Success@
--
--     -   @Cancelled@
--
--     -   @Failed@
--
--     -   @TimedOut@ (this includes both Delivery and Execution time outs)
--
--     -   @AccessDenied@
--
--     -   @DeliveryTimedOut@
--
--     -   @ExecutionTimedOut@
--
--     -   @Incomplete@
--
--     -   @NoInstancesInTag@
--
--     -   @LimitExceeded@
--
--     The status values you can specify for @ListCommandInvocations@ are:
--
--     -   @Pending@
--
--     -   @InProgress@
--
--     -   @Delayed@
--
--     -   @Success@
--
--     -   @Cancelled@
--
--     -   @Failed@
--
--     -   @TimedOut@ (this includes both Delivery and Execution time outs)
--
--     -   @AccessDenied@
--
--     -   @DeliveryTimedOut@
--
--     -   @ExecutionTimedOut@
--
--     -   @Undeliverable@
--
--     -   @InvalidPlatform@
--
--     -   @Terminated@
--
-- -   __DocumentName__: Specify name of the Amazon Web Services Systems
--     Manager document (SSM document) for which you want to see command
--     execution results. For example, specify @AWS-RunPatchBaseline@ to
--     see command executions that used this SSM document to perform
--     security patching operations on instances.
--
-- -   __ExecutionStage__: Specify one of the following values:
--
--     -   @Executing@: Returns a list of command executions that are
--         currently still running.
--
--     -   @Complete@: Returns a list of command executions that have
--         already completed.
commandFilter_value :: Lens.Lens' CommandFilter Prelude.Text
commandFilter_value :: (Text -> f Text) -> CommandFilter -> f CommandFilter
commandFilter_value = (CommandFilter -> Text)
-> (CommandFilter -> Text -> CommandFilter)
-> Lens CommandFilter CommandFilter Text Text
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CommandFilter' {Text
value :: Text
$sel:value:CommandFilter' :: CommandFilter -> Text
value} -> Text
value) (\s :: CommandFilter
s@CommandFilter' {} Text
a -> CommandFilter
s {$sel:value:CommandFilter' :: Text
value = Text
a} :: CommandFilter)

instance Prelude.Hashable CommandFilter

instance Prelude.NFData CommandFilter

instance Core.ToJSON CommandFilter where
  toJSON :: CommandFilter -> Value
toJSON CommandFilter' {Text
CommandFilterKey
value :: Text
key :: CommandFilterKey
$sel:value:CommandFilter' :: CommandFilter -> Text
$sel:key:CommandFilter' :: CommandFilter -> CommandFilterKey
..} =
    [Pair] -> Value
Core.object
      ( [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"key" Text -> CommandFilterKey -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= CommandFilterKey
key),
            Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"value" Text -> Text -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= Text
value)
          ]
      )