{-# 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.Transfer.Types.WorkflowStep
-- 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.Transfer.Types.WorkflowStep 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.Transfer.Types.CopyStepDetails
import Amazonka.Transfer.Types.CustomStepDetails
import Amazonka.Transfer.Types.DecryptStepDetails
import Amazonka.Transfer.Types.DeleteStepDetails
import Amazonka.Transfer.Types.TagStepDetails
import Amazonka.Transfer.Types.WorkflowStepType

-- | The basic building block of a workflow.
--
-- /See:/ 'newWorkflowStep' smart constructor.
data WorkflowStep = WorkflowStep'
  { -- | Details for a step that performs a file copy.
    --
    -- Consists of the following values:
    --
    -- -   A description
    --
    -- -   An S3 location for the destination of the file copy.
    --
    -- -   A flag that indicates whether or not to overwrite an existing file
    --     of the same name. The default is @FALSE@.
    WorkflowStep -> Maybe CopyStepDetails
copyStepDetails :: Prelude.Maybe CopyStepDetails,
    -- | Details for a step that invokes a lambda function.
    --
    -- Consists of the lambda function name, target, and timeout (in seconds).
    WorkflowStep -> Maybe CustomStepDetails
customStepDetails :: Prelude.Maybe CustomStepDetails,
    WorkflowStep -> Maybe DecryptStepDetails
decryptStepDetails :: Prelude.Maybe DecryptStepDetails,
    -- | Details for a step that deletes the file.
    WorkflowStep -> Maybe DeleteStepDetails
deleteStepDetails :: Prelude.Maybe DeleteStepDetails,
    -- | Details for a step that creates one or more tags.
    --
    -- You specify one or more tags: each tag contains a key\/value pair.
    WorkflowStep -> Maybe TagStepDetails
tagStepDetails :: Prelude.Maybe TagStepDetails,
    -- | Currently, the following step types are supported.
    --
    -- -   /COPY/: Copy the file to another location.
    --
    -- -   /CUSTOM/: Perform a custom step with an Lambda function target.
    --
    -- -   /DELETE/: Delete the file.
    --
    -- -   /TAG/: Add a tag to the file.
    WorkflowStep -> Maybe WorkflowStepType
type' :: Prelude.Maybe WorkflowStepType
  }
  deriving (WorkflowStep -> WorkflowStep -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: WorkflowStep -> WorkflowStep -> Bool
$c/= :: WorkflowStep -> WorkflowStep -> Bool
== :: WorkflowStep -> WorkflowStep -> Bool
$c== :: WorkflowStep -> WorkflowStep -> Bool
Prelude.Eq, ReadPrec [WorkflowStep]
ReadPrec WorkflowStep
Int -> ReadS WorkflowStep
ReadS [WorkflowStep]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [WorkflowStep]
$creadListPrec :: ReadPrec [WorkflowStep]
readPrec :: ReadPrec WorkflowStep
$creadPrec :: ReadPrec WorkflowStep
readList :: ReadS [WorkflowStep]
$creadList :: ReadS [WorkflowStep]
readsPrec :: Int -> ReadS WorkflowStep
$creadsPrec :: Int -> ReadS WorkflowStep
Prelude.Read, Int -> WorkflowStep -> ShowS
[WorkflowStep] -> ShowS
WorkflowStep -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [WorkflowStep] -> ShowS
$cshowList :: [WorkflowStep] -> ShowS
show :: WorkflowStep -> String
$cshow :: WorkflowStep -> String
showsPrec :: Int -> WorkflowStep -> ShowS
$cshowsPrec :: Int -> WorkflowStep -> ShowS
Prelude.Show, forall x. Rep WorkflowStep x -> WorkflowStep
forall x. WorkflowStep -> Rep WorkflowStep x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep WorkflowStep x -> WorkflowStep
$cfrom :: forall x. WorkflowStep -> Rep WorkflowStep x
Prelude.Generic)

-- |
-- Create a value of 'WorkflowStep' 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:
--
-- 'copyStepDetails', 'workflowStep_copyStepDetails' - Details for a step that performs a file copy.
--
-- Consists of the following values:
--
-- -   A description
--
-- -   An S3 location for the destination of the file copy.
--
-- -   A flag that indicates whether or not to overwrite an existing file
--     of the same name. The default is @FALSE@.
--
-- 'customStepDetails', 'workflowStep_customStepDetails' - Details for a step that invokes a lambda function.
--
-- Consists of the lambda function name, target, and timeout (in seconds).
--
-- 'decryptStepDetails', 'workflowStep_decryptStepDetails' - Undocumented member.
--
-- 'deleteStepDetails', 'workflowStep_deleteStepDetails' - Details for a step that deletes the file.
--
-- 'tagStepDetails', 'workflowStep_tagStepDetails' - Details for a step that creates one or more tags.
--
-- You specify one or more tags: each tag contains a key\/value pair.
--
-- 'type'', 'workflowStep_type' - Currently, the following step types are supported.
--
-- -   /COPY/: Copy the file to another location.
--
-- -   /CUSTOM/: Perform a custom step with an Lambda function target.
--
-- -   /DELETE/: Delete the file.
--
-- -   /TAG/: Add a tag to the file.
newWorkflowStep ::
  WorkflowStep
newWorkflowStep :: WorkflowStep
newWorkflowStep =
  WorkflowStep'
    { $sel:copyStepDetails:WorkflowStep' :: Maybe CopyStepDetails
copyStepDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:customStepDetails:WorkflowStep' :: Maybe CustomStepDetails
customStepDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:decryptStepDetails:WorkflowStep' :: Maybe DecryptStepDetails
decryptStepDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:deleteStepDetails:WorkflowStep' :: Maybe DeleteStepDetails
deleteStepDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:tagStepDetails:WorkflowStep' :: Maybe TagStepDetails
tagStepDetails = forall a. Maybe a
Prelude.Nothing,
      $sel:type':WorkflowStep' :: Maybe WorkflowStepType
type' = forall a. Maybe a
Prelude.Nothing
    }

-- | Details for a step that performs a file copy.
--
-- Consists of the following values:
--
-- -   A description
--
-- -   An S3 location for the destination of the file copy.
--
-- -   A flag that indicates whether or not to overwrite an existing file
--     of the same name. The default is @FALSE@.
workflowStep_copyStepDetails :: Lens.Lens' WorkflowStep (Prelude.Maybe CopyStepDetails)
workflowStep_copyStepDetails :: Lens' WorkflowStep (Maybe CopyStepDetails)
workflowStep_copyStepDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\WorkflowStep' {Maybe CopyStepDetails
copyStepDetails :: Maybe CopyStepDetails
$sel:copyStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CopyStepDetails
copyStepDetails} -> Maybe CopyStepDetails
copyStepDetails) (\s :: WorkflowStep
s@WorkflowStep' {} Maybe CopyStepDetails
a -> WorkflowStep
s {$sel:copyStepDetails:WorkflowStep' :: Maybe CopyStepDetails
copyStepDetails = Maybe CopyStepDetails
a} :: WorkflowStep)

-- | Details for a step that invokes a lambda function.
--
-- Consists of the lambda function name, target, and timeout (in seconds).
workflowStep_customStepDetails :: Lens.Lens' WorkflowStep (Prelude.Maybe CustomStepDetails)
workflowStep_customStepDetails :: Lens' WorkflowStep (Maybe CustomStepDetails)
workflowStep_customStepDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\WorkflowStep' {Maybe CustomStepDetails
customStepDetails :: Maybe CustomStepDetails
$sel:customStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CustomStepDetails
customStepDetails} -> Maybe CustomStepDetails
customStepDetails) (\s :: WorkflowStep
s@WorkflowStep' {} Maybe CustomStepDetails
a -> WorkflowStep
s {$sel:customStepDetails:WorkflowStep' :: Maybe CustomStepDetails
customStepDetails = Maybe CustomStepDetails
a} :: WorkflowStep)

-- | Undocumented member.
workflowStep_decryptStepDetails :: Lens.Lens' WorkflowStep (Prelude.Maybe DecryptStepDetails)
workflowStep_decryptStepDetails :: Lens' WorkflowStep (Maybe DecryptStepDetails)
workflowStep_decryptStepDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\WorkflowStep' {Maybe DecryptStepDetails
decryptStepDetails :: Maybe DecryptStepDetails
$sel:decryptStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DecryptStepDetails
decryptStepDetails} -> Maybe DecryptStepDetails
decryptStepDetails) (\s :: WorkflowStep
s@WorkflowStep' {} Maybe DecryptStepDetails
a -> WorkflowStep
s {$sel:decryptStepDetails:WorkflowStep' :: Maybe DecryptStepDetails
decryptStepDetails = Maybe DecryptStepDetails
a} :: WorkflowStep)

-- | Details for a step that deletes the file.
workflowStep_deleteStepDetails :: Lens.Lens' WorkflowStep (Prelude.Maybe DeleteStepDetails)
workflowStep_deleteStepDetails :: Lens' WorkflowStep (Maybe DeleteStepDetails)
workflowStep_deleteStepDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\WorkflowStep' {Maybe DeleteStepDetails
deleteStepDetails :: Maybe DeleteStepDetails
$sel:deleteStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DeleteStepDetails
deleteStepDetails} -> Maybe DeleteStepDetails
deleteStepDetails) (\s :: WorkflowStep
s@WorkflowStep' {} Maybe DeleteStepDetails
a -> WorkflowStep
s {$sel:deleteStepDetails:WorkflowStep' :: Maybe DeleteStepDetails
deleteStepDetails = Maybe DeleteStepDetails
a} :: WorkflowStep)

-- | Details for a step that creates one or more tags.
--
-- You specify one or more tags: each tag contains a key\/value pair.
workflowStep_tagStepDetails :: Lens.Lens' WorkflowStep (Prelude.Maybe TagStepDetails)
workflowStep_tagStepDetails :: Lens' WorkflowStep (Maybe TagStepDetails)
workflowStep_tagStepDetails = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\WorkflowStep' {Maybe TagStepDetails
tagStepDetails :: Maybe TagStepDetails
$sel:tagStepDetails:WorkflowStep' :: WorkflowStep -> Maybe TagStepDetails
tagStepDetails} -> Maybe TagStepDetails
tagStepDetails) (\s :: WorkflowStep
s@WorkflowStep' {} Maybe TagStepDetails
a -> WorkflowStep
s {$sel:tagStepDetails:WorkflowStep' :: Maybe TagStepDetails
tagStepDetails = Maybe TagStepDetails
a} :: WorkflowStep)

-- | Currently, the following step types are supported.
--
-- -   /COPY/: Copy the file to another location.
--
-- -   /CUSTOM/: Perform a custom step with an Lambda function target.
--
-- -   /DELETE/: Delete the file.
--
-- -   /TAG/: Add a tag to the file.
workflowStep_type :: Lens.Lens' WorkflowStep (Prelude.Maybe WorkflowStepType)
workflowStep_type :: Lens' WorkflowStep (Maybe WorkflowStepType)
workflowStep_type = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\WorkflowStep' {Maybe WorkflowStepType
type' :: Maybe WorkflowStepType
$sel:type':WorkflowStep' :: WorkflowStep -> Maybe WorkflowStepType
type'} -> Maybe WorkflowStepType
type') (\s :: WorkflowStep
s@WorkflowStep' {} Maybe WorkflowStepType
a -> WorkflowStep
s {$sel:type':WorkflowStep' :: Maybe WorkflowStepType
type' = Maybe WorkflowStepType
a} :: WorkflowStep)

instance Data.FromJSON WorkflowStep where
  parseJSON :: Value -> Parser WorkflowStep
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"WorkflowStep"
      ( \Object
x ->
          Maybe CopyStepDetails
-> Maybe CustomStepDetails
-> Maybe DecryptStepDetails
-> Maybe DeleteStepDetails
-> Maybe TagStepDetails
-> Maybe WorkflowStepType
-> WorkflowStep
WorkflowStep'
            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
"CopyStepDetails")
            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
"CustomStepDetails")
            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
"DecryptStepDetails")
            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
"DeleteStepDetails")
            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
"TagStepDetails")
            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
"Type")
      )

instance Prelude.Hashable WorkflowStep where
  hashWithSalt :: Int -> WorkflowStep -> Int
hashWithSalt Int
_salt WorkflowStep' {Maybe CustomStepDetails
Maybe DeleteStepDetails
Maybe DecryptStepDetails
Maybe CopyStepDetails
Maybe TagStepDetails
Maybe WorkflowStepType
type' :: Maybe WorkflowStepType
tagStepDetails :: Maybe TagStepDetails
deleteStepDetails :: Maybe DeleteStepDetails
decryptStepDetails :: Maybe DecryptStepDetails
customStepDetails :: Maybe CustomStepDetails
copyStepDetails :: Maybe CopyStepDetails
$sel:type':WorkflowStep' :: WorkflowStep -> Maybe WorkflowStepType
$sel:tagStepDetails:WorkflowStep' :: WorkflowStep -> Maybe TagStepDetails
$sel:deleteStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DeleteStepDetails
$sel:decryptStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DecryptStepDetails
$sel:customStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CustomStepDetails
$sel:copyStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CopyStepDetails
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CopyStepDetails
copyStepDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CustomStepDetails
customStepDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe DecryptStepDetails
decryptStepDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe DeleteStepDetails
deleteStepDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe TagStepDetails
tagStepDetails
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe WorkflowStepType
type'

instance Prelude.NFData WorkflowStep where
  rnf :: WorkflowStep -> ()
rnf WorkflowStep' {Maybe CustomStepDetails
Maybe DeleteStepDetails
Maybe DecryptStepDetails
Maybe CopyStepDetails
Maybe TagStepDetails
Maybe WorkflowStepType
type' :: Maybe WorkflowStepType
tagStepDetails :: Maybe TagStepDetails
deleteStepDetails :: Maybe DeleteStepDetails
decryptStepDetails :: Maybe DecryptStepDetails
customStepDetails :: Maybe CustomStepDetails
copyStepDetails :: Maybe CopyStepDetails
$sel:type':WorkflowStep' :: WorkflowStep -> Maybe WorkflowStepType
$sel:tagStepDetails:WorkflowStep' :: WorkflowStep -> Maybe TagStepDetails
$sel:deleteStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DeleteStepDetails
$sel:decryptStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DecryptStepDetails
$sel:customStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CustomStepDetails
$sel:copyStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CopyStepDetails
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe CopyStepDetails
copyStepDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe CustomStepDetails
customStepDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe DecryptStepDetails
decryptStepDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe DeleteStepDetails
deleteStepDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe TagStepDetails
tagStepDetails
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe WorkflowStepType
type'

instance Data.ToJSON WorkflowStep where
  toJSON :: WorkflowStep -> Value
toJSON WorkflowStep' {Maybe CustomStepDetails
Maybe DeleteStepDetails
Maybe DecryptStepDetails
Maybe CopyStepDetails
Maybe TagStepDetails
Maybe WorkflowStepType
type' :: Maybe WorkflowStepType
tagStepDetails :: Maybe TagStepDetails
deleteStepDetails :: Maybe DeleteStepDetails
decryptStepDetails :: Maybe DecryptStepDetails
customStepDetails :: Maybe CustomStepDetails
copyStepDetails :: Maybe CopyStepDetails
$sel:type':WorkflowStep' :: WorkflowStep -> Maybe WorkflowStepType
$sel:tagStepDetails:WorkflowStep' :: WorkflowStep -> Maybe TagStepDetails
$sel:deleteStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DeleteStepDetails
$sel:decryptStepDetails:WorkflowStep' :: WorkflowStep -> Maybe DecryptStepDetails
$sel:customStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CustomStepDetails
$sel:copyStepDetails:WorkflowStep' :: WorkflowStep -> Maybe CopyStepDetails
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"CopyStepDetails" 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 CopyStepDetails
copyStepDetails,
            (Key
"CustomStepDetails" 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 CustomStepDetails
customStepDetails,
            (Key
"DecryptStepDetails" 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 DecryptStepDetails
decryptStepDetails,
            (Key
"DeleteStepDetails" 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 DeleteStepDetails
deleteStepDetails,
            (Key
"TagStepDetails" 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 TagStepDetails
tagStepDetails,
            (Key
"Type" 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 WorkflowStepType
type'
          ]
      )