{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric      #-}
{-# LANGUAGE NoImplicitPrelude  #-}
{-# LANGUAGE OverloadedStrings  #-}
{-# LANGUAGE RecordWildCards    #-}

{-# OPTIONS_GHC -fno-warn-unused-binds   #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}

-- |
-- Module      : Network.Google.Dataflow.Types.Product
-- Copyright   : (c) 2015-2016 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
module Network.Google.Dataflow.Types.Product where

import           Network.Google.Dataflow.Types.Sum
import           Network.Google.Prelude

-- | A mapping from each stage to the information about that stage.
--
-- /See:/ 'jobExecutionInfoStages' smart constructor.
newtype JobExecutionInfoStages = JobExecutionInfoStages'
    { _jeisAddtional :: HashMap Text JobExecutionStageInfo
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobExecutionInfoStages' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jeisAddtional'
jobExecutionInfoStages
    :: HashMap Text JobExecutionStageInfo -- ^ 'jeisAddtional'
    -> JobExecutionInfoStages
jobExecutionInfoStages pJeisAddtional_ =
    JobExecutionInfoStages'
    { _jeisAddtional = _Coerce # pJeisAddtional_
    }

jeisAddtional :: Lens' JobExecutionInfoStages (HashMap Text JobExecutionStageInfo)
jeisAddtional
  = lens _jeisAddtional
      (\ s a -> s{_jeisAddtional = a})
      . _Coerce

instance FromJSON JobExecutionInfoStages where
        parseJSON
          = withObject "JobExecutionInfoStages"
              (\ o ->
                 JobExecutionInfoStages' <$> (parseJSONObject o))

instance ToJSON JobExecutionInfoStages where
        toJSON = toJSON . _jeisAddtional

-- | All configuration data for a particular Computation.
--
-- /See:/ 'computationTopology' smart constructor.
data ComputationTopology = ComputationTopology'
    { _ctStateFamilies   :: !(Maybe [StateFamilyConfig])
    , _ctUserStageName   :: !(Maybe Text)
    , _ctInputs          :: !(Maybe [StreamLocation])
    , _ctKeyRanges       :: !(Maybe [KeyRangeLocation])
    , _ctOutputs         :: !(Maybe [StreamLocation])
    , _ctComputationId   :: !(Maybe Text)
    , _ctSystemStageName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ComputationTopology' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ctStateFamilies'
--
-- * 'ctUserStageName'
--
-- * 'ctInputs'
--
-- * 'ctKeyRanges'
--
-- * 'ctOutputs'
--
-- * 'ctComputationId'
--
-- * 'ctSystemStageName'
computationTopology
    :: ComputationTopology
computationTopology =
    ComputationTopology'
    { _ctStateFamilies = Nothing
    , _ctUserStageName = Nothing
    , _ctInputs = Nothing
    , _ctKeyRanges = Nothing
    , _ctOutputs = Nothing
    , _ctComputationId = Nothing
    , _ctSystemStageName = Nothing
    }

-- | The state family values.
ctStateFamilies :: Lens' ComputationTopology [StateFamilyConfig]
ctStateFamilies
  = lens _ctStateFamilies
      (\ s a -> s{_ctStateFamilies = a})
      . _Default
      . _Coerce

-- | The user stage name.
ctUserStageName :: Lens' ComputationTopology (Maybe Text)
ctUserStageName
  = lens _ctUserStageName
      (\ s a -> s{_ctUserStageName = a})

-- | The inputs to the computation.
ctInputs :: Lens' ComputationTopology [StreamLocation]
ctInputs
  = lens _ctInputs (\ s a -> s{_ctInputs = a}) .
      _Default
      . _Coerce

-- | The key ranges processed by the computation.
ctKeyRanges :: Lens' ComputationTopology [KeyRangeLocation]
ctKeyRanges
  = lens _ctKeyRanges (\ s a -> s{_ctKeyRanges = a}) .
      _Default
      . _Coerce

-- | The outputs from the computation.
ctOutputs :: Lens' ComputationTopology [StreamLocation]
ctOutputs
  = lens _ctOutputs (\ s a -> s{_ctOutputs = a}) .
      _Default
      . _Coerce

-- | The ID of the computation.
ctComputationId :: Lens' ComputationTopology (Maybe Text)
ctComputationId
  = lens _ctComputationId
      (\ s a -> s{_ctComputationId = a})

-- | The system stage name.
ctSystemStageName :: Lens' ComputationTopology (Maybe Text)
ctSystemStageName
  = lens _ctSystemStageName
      (\ s a -> s{_ctSystemStageName = a})

instance FromJSON ComputationTopology where
        parseJSON
          = withObject "ComputationTopology"
              (\ o ->
                 ComputationTopology' <$>
                   (o .:? "stateFamilies" .!= mempty) <*>
                     (o .:? "userStageName")
                     <*> (o .:? "inputs" .!= mempty)
                     <*> (o .:? "keyRanges" .!= mempty)
                     <*> (o .:? "outputs" .!= mempty)
                     <*> (o .:? "computationId")
                     <*> (o .:? "systemStageName"))

instance ToJSON ComputationTopology where
        toJSON ComputationTopology'{..}
          = object
              (catMaybes
                 [("stateFamilies" .=) <$> _ctStateFamilies,
                  ("userStageName" .=) <$> _ctUserStageName,
                  ("inputs" .=) <$> _ctInputs,
                  ("keyRanges" .=) <$> _ctKeyRanges,
                  ("outputs" .=) <$> _ctOutputs,
                  ("computationId" .=) <$> _ctComputationId,
                  ("systemStageName" .=) <$> _ctSystemStageName])

-- | The response to a SourceSplitRequest.
--
-- /See:/ 'sourceSplitResponse' smart constructor.
data SourceSplitResponse = SourceSplitResponse'
    { _ssrBundles :: !(Maybe [DerivedSource])
    , _ssrShards  :: !(Maybe [SourceSplitShard])
    , _ssrOutcome :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceSplitResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssrBundles'
--
-- * 'ssrShards'
--
-- * 'ssrOutcome'
sourceSplitResponse
    :: SourceSplitResponse
sourceSplitResponse =
    SourceSplitResponse'
    { _ssrBundles = Nothing
    , _ssrShards = Nothing
    , _ssrOutcome = Nothing
    }

-- | If outcome is SPLITTING_HAPPENED, then this is a list of bundles into
-- which the source was split. Otherwise this field is ignored. This list
-- can be empty, which means the source represents an empty input.
ssrBundles :: Lens' SourceSplitResponse [DerivedSource]
ssrBundles
  = lens _ssrBundles (\ s a -> s{_ssrBundles = a}) .
      _Default
      . _Coerce

-- | DEPRECATED in favor of bundles.
ssrShards :: Lens' SourceSplitResponse [SourceSplitShard]
ssrShards
  = lens _ssrShards (\ s a -> s{_ssrShards = a}) .
      _Default
      . _Coerce

-- | Indicates whether splitting happened and produced a list of bundles. If
-- this is USE_CURRENT_SOURCE_AS_IS, the current source should be processed
-- \"as is\" without splitting. \"bundles\" is ignored in this case. If
-- this is SPLITTING_HAPPENED, then \"bundles\" contains a list of bundles
-- into which the source was split.
ssrOutcome :: Lens' SourceSplitResponse (Maybe Text)
ssrOutcome
  = lens _ssrOutcome (\ s a -> s{_ssrOutcome = a})

instance FromJSON SourceSplitResponse where
        parseJSON
          = withObject "SourceSplitResponse"
              (\ o ->
                 SourceSplitResponse' <$>
                   (o .:? "bundles" .!= mempty) <*>
                     (o .:? "shards" .!= mempty)
                     <*> (o .:? "outcome"))

instance ToJSON SourceSplitResponse where
        toJSON SourceSplitResponse'{..}
          = object
              (catMaybes
                 [("bundles" .=) <$> _ssrBundles,
                  ("shards" .=) <$> _ssrShards,
                  ("outcome" .=) <$> _ssrOutcome])

--
-- /See:/ 'resourceUtilizationReportMetricsItem' smart constructor.
newtype ResourceUtilizationReportMetricsItem = ResourceUtilizationReportMetricsItem'
    { _rurmiAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ResourceUtilizationReportMetricsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rurmiAddtional'
resourceUtilizationReportMetricsItem
    :: HashMap Text JSONValue -- ^ 'rurmiAddtional'
    -> ResourceUtilizationReportMetricsItem
resourceUtilizationReportMetricsItem pRurmiAddtional_ =
    ResourceUtilizationReportMetricsItem'
    { _rurmiAddtional = _Coerce # pRurmiAddtional_
    }

-- | Properties of the object.
rurmiAddtional :: Lens' ResourceUtilizationReportMetricsItem (HashMap Text JSONValue)
rurmiAddtional
  = lens _rurmiAddtional
      (\ s a -> s{_rurmiAddtional = a})
      . _Coerce

instance FromJSON
         ResourceUtilizationReportMetricsItem where
        parseJSON
          = withObject "ResourceUtilizationReportMetricsItem"
              (\ o ->
                 ResourceUtilizationReportMetricsItem' <$>
                   (parseJSONObject o))

instance ToJSON ResourceUtilizationReportMetricsItem
         where
        toJSON = toJSON . _rurmiAddtional

-- | A request to create a Cloud Dataflow job from a template.
--
-- /See:/ 'createJobFromTemplateRequest' smart constructor.
data CreateJobFromTemplateRequest = CreateJobFromTemplateRequest'
    { _cjftrEnvironment :: !(Maybe RuntimeEnvironment)
    , _cjftrJobName     :: !(Maybe Text)
    , _cjftrGcsPath     :: !(Maybe Text)
    , _cjftrParameters  :: !(Maybe CreateJobFromTemplateRequestParameters)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateJobFromTemplateRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cjftrEnvironment'
--
-- * 'cjftrJobName'
--
-- * 'cjftrGcsPath'
--
-- * 'cjftrParameters'
createJobFromTemplateRequest
    :: CreateJobFromTemplateRequest
createJobFromTemplateRequest =
    CreateJobFromTemplateRequest'
    { _cjftrEnvironment = Nothing
    , _cjftrJobName = Nothing
    , _cjftrGcsPath = Nothing
    , _cjftrParameters = Nothing
    }

-- | The runtime environment for the job.
cjftrEnvironment :: Lens' CreateJobFromTemplateRequest (Maybe RuntimeEnvironment)
cjftrEnvironment
  = lens _cjftrEnvironment
      (\ s a -> s{_cjftrEnvironment = a})

-- | Required. The job name to use for the created job.
cjftrJobName :: Lens' CreateJobFromTemplateRequest (Maybe Text)
cjftrJobName
  = lens _cjftrJobName (\ s a -> s{_cjftrJobName = a})

-- | Required. A Cloud Storage path to the template from which to create the
-- job. Must be a valid Cloud Storage URL, beginning with \`gs:\/\/\`.
cjftrGcsPath :: Lens' CreateJobFromTemplateRequest (Maybe Text)
cjftrGcsPath
  = lens _cjftrGcsPath (\ s a -> s{_cjftrGcsPath = a})

-- | The runtime parameters to pass to the job.
cjftrParameters :: Lens' CreateJobFromTemplateRequest (Maybe CreateJobFromTemplateRequestParameters)
cjftrParameters
  = lens _cjftrParameters
      (\ s a -> s{_cjftrParameters = a})

instance FromJSON CreateJobFromTemplateRequest where
        parseJSON
          = withObject "CreateJobFromTemplateRequest"
              (\ o ->
                 CreateJobFromTemplateRequest' <$>
                   (o .:? "environment") <*> (o .:? "jobName") <*>
                     (o .:? "gcsPath")
                     <*> (o .:? "parameters"))

instance ToJSON CreateJobFromTemplateRequest where
        toJSON CreateJobFromTemplateRequest'{..}
          = object
              (catMaybes
                 [("environment" .=) <$> _cjftrEnvironment,
                  ("jobName" .=) <$> _cjftrJobName,
                  ("gcsPath" .=) <$> _cjftrGcsPath,
                  ("parameters" .=) <$> _cjftrParameters])

-- | The \`Status\` type defines a logical error model that is suitable for
-- different programming environments, including REST APIs and RPC APIs. It
-- is used by [gRPC](https:\/\/github.com\/grpc). The error model is
-- designed to be: - Simple to use and understand for most users - Flexible
-- enough to meet unexpected needs # Overview The \`Status\` message
-- contains three pieces of data: error code, error message, and error
-- details. The error code should be an enum value of google.rpc.Code, but
-- it may accept additional error codes if needed. The error message should
-- be a developer-facing English message that helps developers *understand*
-- and *resolve* the error. If a localized user-facing error message is
-- needed, put the localized message in the error details or localize it in
-- the client. The optional error details may contain arbitrary information
-- about the error. There is a predefined set of error detail types in the
-- package \`google.rpc\` which can be used for common error conditions. #
-- Language mapping The \`Status\` message is the logical representation of
-- the error model, but it is not necessarily the actual wire format. When
-- the \`Status\` message is exposed in different client libraries and
-- different wire protocols, it can be mapped differently. For example, it
-- will likely be mapped to some exceptions in Java, but more likely mapped
-- to some error codes in C. # Other uses The error model and the
-- \`Status\` message can be used in a variety of environments, either with
-- or without APIs, to provide a consistent developer experience across
-- different environments. Example uses of this error model include: -
-- Partial errors. If a service needs to return partial errors to the
-- client, it may embed the \`Status\` in the normal response to indicate
-- the partial errors. - Workflow errors. A typical workflow has multiple
-- steps. Each step may have a \`Status\` message for error reporting
-- purpose. - Batch operations. If a client uses batch request and batch
-- response, the \`Status\` message should be used directly inside batch
-- response, one for each error sub-response. - Asynchronous operations. If
-- an API call embeds asynchronous operation results in its response, the
-- status of those operations should be represented directly using the
-- \`Status\` message. - Logging. If some API errors are stored in logs,
-- the message \`Status\` could be used directly after any stripping needed
-- for security\/privacy reasons.
--
-- /See:/ 'status' smart constructor.
data Status = Status'
    { _sDetails :: !(Maybe [StatusDetailsItem])
    , _sCode    :: !(Maybe (Textual Int32))
    , _sMessage :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Status' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sDetails'
--
-- * 'sCode'
--
-- * 'sMessage'
status
    :: Status
status =
    Status'
    { _sDetails = Nothing
    , _sCode = Nothing
    , _sMessage = Nothing
    }

-- | A list of messages that carry the error details. There will be a common
-- set of message types for APIs to use.
sDetails :: Lens' Status [StatusDetailsItem]
sDetails
  = lens _sDetails (\ s a -> s{_sDetails = a}) .
      _Default
      . _Coerce

-- | The status code, which should be an enum value of google.rpc.Code.
sCode :: Lens' Status (Maybe Int32)
sCode
  = lens _sCode (\ s a -> s{_sCode = a}) .
      mapping _Coerce

-- | A developer-facing error message, which should be in English. Any
-- user-facing error message should be localized and sent in the
-- google.rpc.Status.details field, or localized by the client.
sMessage :: Lens' Status (Maybe Text)
sMessage = lens _sMessage (\ s a -> s{_sMessage = a})

instance FromJSON Status where
        parseJSON
          = withObject "Status"
              (\ o ->
                 Status' <$>
                   (o .:? "details" .!= mempty) <*> (o .:? "code") <*>
                     (o .:? "message"))

instance ToJSON Status where
        toJSON Status'{..}
          = object
              (catMaybes
                 [("details" .=) <$> _sDetails,
                  ("code" .=) <$> _sCode,
                  ("message" .=) <$> _sMessage])

-- | Basic metadata about a counter.
--
-- /See:/ 'nameAndKind' smart constructor.
data NameAndKind = NameAndKind'
    { _nakKind :: !(Maybe Text)
    , _nakName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'NameAndKind' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'nakKind'
--
-- * 'nakName'
nameAndKind
    :: NameAndKind
nameAndKind =
    NameAndKind'
    { _nakKind = Nothing
    , _nakName = Nothing
    }

-- | Counter aggregation kind.
nakKind :: Lens' NameAndKind (Maybe Text)
nakKind = lens _nakKind (\ s a -> s{_nakKind = a})

-- | Name of the counter.
nakName :: Lens' NameAndKind (Maybe Text)
nakName = lens _nakName (\ s a -> s{_nakName = a})

instance FromJSON NameAndKind where
        parseJSON
          = withObject "NameAndKind"
              (\ o ->
                 NameAndKind' <$> (o .:? "kind") <*> (o .:? "name"))

instance ToJSON NameAndKind where
        toJSON NameAndKind'{..}
          = object
              (catMaybes
                 [("kind" .=) <$> _nakKind, ("name" .=) <$> _nakName])

-- | A metric value representing a list of integers.
--
-- /See:/ 'integerList' smart constructor.
newtype IntegerList = IntegerList'
    { _ilElements :: Maybe [SplitInt64]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'IntegerList' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ilElements'
integerList
    :: IntegerList
integerList =
    IntegerList'
    { _ilElements = Nothing
    }

-- | Elements of the list.
ilElements :: Lens' IntegerList [SplitInt64]
ilElements
  = lens _ilElements (\ s a -> s{_ilElements = a}) .
      _Default
      . _Coerce

instance FromJSON IntegerList where
        parseJSON
          = withObject "IntegerList"
              (\ o ->
                 IntegerList' <$> (o .:? "elements" .!= mempty))

instance ToJSON IntegerList where
        toJSON IntegerList'{..}
          = object
              (catMaybes [("elements" .=) <$> _ilElements])

-- | WorkItem represents basic information about a WorkItem to be executed in
-- the cloud.
--
-- /See:/ 'workItem' smart constructor.
data WorkItem = WorkItem'
    { _wiJobId                    :: !(Maybe Text)
    , _wiReportStatusInterval     :: !(Maybe Text)
    , _wiShellTask                :: !(Maybe ShellTask)
    , _wiStreamingSetupTask       :: !(Maybe StreamingSetupTask)
    , _wiInitialReportIndex       :: !(Maybe (Textual Int64))
    , _wiMapTask                  :: !(Maybe MapTask)
    , _wiPackages                 :: !(Maybe [Package])
    , _wiStreamingComputationTask :: !(Maybe StreamingComputationTask)
    , _wiSourceOperationTask      :: !(Maybe SourceOperationRequest)
    , _wiId                       :: !(Maybe (Textual Int64))
    , _wiProjectId                :: !(Maybe Text)
    , _wiLeaseExpireTime          :: !(Maybe Text)
    , _wiConfiguration            :: !(Maybe Text)
    , _wiStreamingConfigTask      :: !(Maybe StreamingConfigTask)
    , _wiSeqMapTask               :: !(Maybe SeqMapTask)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wiJobId'
--
-- * 'wiReportStatusInterval'
--
-- * 'wiShellTask'
--
-- * 'wiStreamingSetupTask'
--
-- * 'wiInitialReportIndex'
--
-- * 'wiMapTask'
--
-- * 'wiPackages'
--
-- * 'wiStreamingComputationTask'
--
-- * 'wiSourceOperationTask'
--
-- * 'wiId'
--
-- * 'wiProjectId'
--
-- * 'wiLeaseExpireTime'
--
-- * 'wiConfiguration'
--
-- * 'wiStreamingConfigTask'
--
-- * 'wiSeqMapTask'
workItem
    :: WorkItem
workItem =
    WorkItem'
    { _wiJobId = Nothing
    , _wiReportStatusInterval = Nothing
    , _wiShellTask = Nothing
    , _wiStreamingSetupTask = Nothing
    , _wiInitialReportIndex = Nothing
    , _wiMapTask = Nothing
    , _wiPackages = Nothing
    , _wiStreamingComputationTask = Nothing
    , _wiSourceOperationTask = Nothing
    , _wiId = Nothing
    , _wiProjectId = Nothing
    , _wiLeaseExpireTime = Nothing
    , _wiConfiguration = Nothing
    , _wiStreamingConfigTask = Nothing
    , _wiSeqMapTask = Nothing
    }

-- | Identifies the workflow job this WorkItem belongs to.
wiJobId :: Lens' WorkItem (Maybe Text)
wiJobId = lens _wiJobId (\ s a -> s{_wiJobId = a})

-- | Recommended reporting interval.
wiReportStatusInterval :: Lens' WorkItem (Maybe Text)
wiReportStatusInterval
  = lens _wiReportStatusInterval
      (\ s a -> s{_wiReportStatusInterval = a})

-- | Additional information for ShellTask WorkItems.
wiShellTask :: Lens' WorkItem (Maybe ShellTask)
wiShellTask
  = lens _wiShellTask (\ s a -> s{_wiShellTask = a})

-- | Additional information for StreamingSetupTask WorkItems.
wiStreamingSetupTask :: Lens' WorkItem (Maybe StreamingSetupTask)
wiStreamingSetupTask
  = lens _wiStreamingSetupTask
      (\ s a -> s{_wiStreamingSetupTask = a})

-- | The initial index to use when reporting the status of the WorkItem.
wiInitialReportIndex :: Lens' WorkItem (Maybe Int64)
wiInitialReportIndex
  = lens _wiInitialReportIndex
      (\ s a -> s{_wiInitialReportIndex = a})
      . mapping _Coerce

-- | Additional information for MapTask WorkItems.
wiMapTask :: Lens' WorkItem (Maybe MapTask)
wiMapTask
  = lens _wiMapTask (\ s a -> s{_wiMapTask = a})

-- | Any required packages that need to be fetched in order to execute this
-- WorkItem.
wiPackages :: Lens' WorkItem [Package]
wiPackages
  = lens _wiPackages (\ s a -> s{_wiPackages = a}) .
      _Default
      . _Coerce

-- | Additional information for StreamingComputationTask WorkItems.
wiStreamingComputationTask :: Lens' WorkItem (Maybe StreamingComputationTask)
wiStreamingComputationTask
  = lens _wiStreamingComputationTask
      (\ s a -> s{_wiStreamingComputationTask = a})

-- | Additional information for source operation WorkItems.
wiSourceOperationTask :: Lens' WorkItem (Maybe SourceOperationRequest)
wiSourceOperationTask
  = lens _wiSourceOperationTask
      (\ s a -> s{_wiSourceOperationTask = a})

-- | Identifies this WorkItem.
wiId :: Lens' WorkItem (Maybe Int64)
wiId
  = lens _wiId (\ s a -> s{_wiId = a}) .
      mapping _Coerce

-- | Identifies the cloud project this WorkItem belongs to.
wiProjectId :: Lens' WorkItem (Maybe Text)
wiProjectId
  = lens _wiProjectId (\ s a -> s{_wiProjectId = a})

-- | Time when the lease on this Work will expire.
wiLeaseExpireTime :: Lens' WorkItem (Maybe Text)
wiLeaseExpireTime
  = lens _wiLeaseExpireTime
      (\ s a -> s{_wiLeaseExpireTime = a})

-- | Work item-specific configuration as an opaque blob.
wiConfiguration :: Lens' WorkItem (Maybe Text)
wiConfiguration
  = lens _wiConfiguration
      (\ s a -> s{_wiConfiguration = a})

-- | Additional information for StreamingConfigTask WorkItems.
wiStreamingConfigTask :: Lens' WorkItem (Maybe StreamingConfigTask)
wiStreamingConfigTask
  = lens _wiStreamingConfigTask
      (\ s a -> s{_wiStreamingConfigTask = a})

-- | Additional information for SeqMapTask WorkItems.
wiSeqMapTask :: Lens' WorkItem (Maybe SeqMapTask)
wiSeqMapTask
  = lens _wiSeqMapTask (\ s a -> s{_wiSeqMapTask = a})

instance FromJSON WorkItem where
        parseJSON
          = withObject "WorkItem"
              (\ o ->
                 WorkItem' <$>
                   (o .:? "jobId") <*> (o .:? "reportStatusInterval")
                     <*> (o .:? "shellTask")
                     <*> (o .:? "streamingSetupTask")
                     <*> (o .:? "initialReportIndex")
                     <*> (o .:? "mapTask")
                     <*> (o .:? "packages" .!= mempty)
                     <*> (o .:? "streamingComputationTask")
                     <*> (o .:? "sourceOperationTask")
                     <*> (o .:? "id")
                     <*> (o .:? "projectId")
                     <*> (o .:? "leaseExpireTime")
                     <*> (o .:? "configuration")
                     <*> (o .:? "streamingConfigTask")
                     <*> (o .:? "seqMapTask"))

instance ToJSON WorkItem where
        toJSON WorkItem'{..}
          = object
              (catMaybes
                 [("jobId" .=) <$> _wiJobId,
                  ("reportStatusInterval" .=) <$>
                    _wiReportStatusInterval,
                  ("shellTask" .=) <$> _wiShellTask,
                  ("streamingSetupTask" .=) <$> _wiStreamingSetupTask,
                  ("initialReportIndex" .=) <$> _wiInitialReportIndex,
                  ("mapTask" .=) <$> _wiMapTask,
                  ("packages" .=) <$> _wiPackages,
                  ("streamingComputationTask" .=) <$>
                    _wiStreamingComputationTask,
                  ("sourceOperationTask" .=) <$>
                    _wiSourceOperationTask,
                  ("id" .=) <$> _wiId,
                  ("projectId" .=) <$> _wiProjectId,
                  ("leaseExpireTime" .=) <$> _wiLeaseExpireTime,
                  ("configuration" .=) <$> _wiConfiguration,
                  ("streamingConfigTask" .=) <$>
                    _wiStreamingConfigTask,
                  ("seqMapTask" .=) <$> _wiSeqMapTask])

-- | WorkerHealthReport contains information about the health of a worker.
-- The VM should be identified by the labels attached to the WorkerMessage
-- that this health ping belongs to.
--
-- /See:/ 'workerHealthReport' smart constructor.
data WorkerHealthReport = WorkerHealthReport'
    { _whrVMIsHealthy    :: !(Maybe Bool)
    , _whrReportInterval :: !(Maybe Text)
    , _whrPods           :: !(Maybe [WorkerHealthReportPodsItem])
    , _whrVMStartupTime  :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerHealthReport' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'whrVMIsHealthy'
--
-- * 'whrReportInterval'
--
-- * 'whrPods'
--
-- * 'whrVMStartupTime'
workerHealthReport
    :: WorkerHealthReport
workerHealthReport =
    WorkerHealthReport'
    { _whrVMIsHealthy = Nothing
    , _whrReportInterval = Nothing
    , _whrPods = Nothing
    , _whrVMStartupTime = Nothing
    }

-- | Whether the VM is healthy.
whrVMIsHealthy :: Lens' WorkerHealthReport (Maybe Bool)
whrVMIsHealthy
  = lens _whrVMIsHealthy
      (\ s a -> s{_whrVMIsHealthy = a})

-- | The interval at which the worker is sending health reports. The default
-- value of 0 should be interpreted as the field is not being explicitly
-- set by the worker.
whrReportInterval :: Lens' WorkerHealthReport (Maybe Text)
whrReportInterval
  = lens _whrReportInterval
      (\ s a -> s{_whrReportInterval = a})

-- | The pods running on the worker. See:
-- http:\/\/kubernetes.io\/v1.1\/docs\/api-reference\/v1\/definitions.html#_v1_pod
-- This field is used by the worker to send the status of the indvidual
-- containers running on each worker.
whrPods :: Lens' WorkerHealthReport [WorkerHealthReportPodsItem]
whrPods
  = lens _whrPods (\ s a -> s{_whrPods = a}) . _Default
      . _Coerce

-- | The time the VM was booted.
whrVMStartupTime :: Lens' WorkerHealthReport (Maybe Text)
whrVMStartupTime
  = lens _whrVMStartupTime
      (\ s a -> s{_whrVMStartupTime = a})

instance FromJSON WorkerHealthReport where
        parseJSON
          = withObject "WorkerHealthReport"
              (\ o ->
                 WorkerHealthReport' <$>
                   (o .:? "vmIsHealthy") <*> (o .:? "reportInterval")
                     <*> (o .:? "pods" .!= mempty)
                     <*> (o .:? "vmStartupTime"))

instance ToJSON WorkerHealthReport where
        toJSON WorkerHealthReport'{..}
          = object
              (catMaybes
                 [("vmIsHealthy" .=) <$> _whrVMIsHealthy,
                  ("reportInterval" .=) <$> _whrReportInterval,
                  ("pods" .=) <$> _whrPods,
                  ("vmStartupTime" .=) <$> _whrVMStartupTime])

-- | Hints for splitting a Source into bundles (parts for parallel
-- processing) using SourceSplitRequest.
--
-- /See:/ 'sourceSplitOptions' smart constructor.
data SourceSplitOptions = SourceSplitOptions'
    { _ssoDesiredShardSizeBytes  :: !(Maybe (Textual Int64))
    , _ssoDesiredBundleSizeBytes :: !(Maybe (Textual Int64))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceSplitOptions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssoDesiredShardSizeBytes'
--
-- * 'ssoDesiredBundleSizeBytes'
sourceSplitOptions
    :: SourceSplitOptions
sourceSplitOptions =
    SourceSplitOptions'
    { _ssoDesiredShardSizeBytes = Nothing
    , _ssoDesiredBundleSizeBytes = Nothing
    }

-- | DEPRECATED in favor of desired_bundle_size_bytes.
ssoDesiredShardSizeBytes :: Lens' SourceSplitOptions (Maybe Int64)
ssoDesiredShardSizeBytes
  = lens _ssoDesiredShardSizeBytes
      (\ s a -> s{_ssoDesiredShardSizeBytes = a})
      . mapping _Coerce

-- | The source should be split into a set of bundles where the estimated
-- size of each is approximately this many bytes.
ssoDesiredBundleSizeBytes :: Lens' SourceSplitOptions (Maybe Int64)
ssoDesiredBundleSizeBytes
  = lens _ssoDesiredBundleSizeBytes
      (\ s a -> s{_ssoDesiredBundleSizeBytes = a})
      . mapping _Coerce

instance FromJSON SourceSplitOptions where
        parseJSON
          = withObject "SourceSplitOptions"
              (\ o ->
                 SourceSplitOptions' <$>
                   (o .:? "desiredShardSizeBytes") <*>
                     (o .:? "desiredBundleSizeBytes"))

instance ToJSON SourceSplitOptions where
        toJSON SourceSplitOptions'{..}
          = object
              (catMaybes
                 [("desiredShardSizeBytes" .=) <$>
                    _ssoDesiredShardSizeBytes,
                  ("desiredBundleSizeBytes" .=) <$>
                    _ssoDesiredBundleSizeBytes])

-- | Metadata to set on the Google Compute Engine VMs.
--
-- /See:/ 'workerPoolMetadata' smart constructor.
newtype WorkerPoolMetadata = WorkerPoolMetadata'
    { _wpmAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerPoolMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wpmAddtional'
workerPoolMetadata
    :: HashMap Text Text -- ^ 'wpmAddtional'
    -> WorkerPoolMetadata
workerPoolMetadata pWpmAddtional_ =
    WorkerPoolMetadata'
    { _wpmAddtional = _Coerce # pWpmAddtional_
    }

wpmAddtional :: Lens' WorkerPoolMetadata (HashMap Text Text)
wpmAddtional
  = lens _wpmAddtional (\ s a -> s{_wpmAddtional = a})
      . _Coerce

instance FromJSON WorkerPoolMetadata where
        parseJSON
          = withObject "WorkerPoolMetadata"
              (\ o -> WorkerPoolMetadata' <$> (parseJSONObject o))

instance ToJSON WorkerPoolMetadata where
        toJSON = toJSON . _wpmAddtional

-- | Settings for WorkerPool autoscaling.
--
-- /See:/ 'autoscalingSettings' smart constructor.
data AutoscalingSettings = AutoscalingSettings'
    { _asMaxNumWorkers :: !(Maybe (Textual Int32))
    , _asAlgorithm     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'AutoscalingSettings' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'asMaxNumWorkers'
--
-- * 'asAlgorithm'
autoscalingSettings
    :: AutoscalingSettings
autoscalingSettings =
    AutoscalingSettings'
    { _asMaxNumWorkers = Nothing
    , _asAlgorithm = Nothing
    }

-- | The maximum number of workers to cap scaling at.
asMaxNumWorkers :: Lens' AutoscalingSettings (Maybe Int32)
asMaxNumWorkers
  = lens _asMaxNumWorkers
      (\ s a -> s{_asMaxNumWorkers = a})
      . mapping _Coerce

-- | The algorithm to use for autoscaling.
asAlgorithm :: Lens' AutoscalingSettings (Maybe Text)
asAlgorithm
  = lens _asAlgorithm (\ s a -> s{_asAlgorithm = a})

instance FromJSON AutoscalingSettings where
        parseJSON
          = withObject "AutoscalingSettings"
              (\ o ->
                 AutoscalingSettings' <$>
                   (o .:? "maxNumWorkers") <*> (o .:? "algorithm"))

instance ToJSON AutoscalingSettings where
        toJSON AutoscalingSettings'{..}
          = object
              (catMaybes
                 [("maxNumWorkers" .=) <$> _asMaxNumWorkers,
                  ("algorithm" .=) <$> _asAlgorithm])

-- | Contains information about how a particular google.dataflow.v1beta3.Step
-- will be executed.
--
-- /See:/ 'jobExecutionStageInfo' smart constructor.
newtype JobExecutionStageInfo = JobExecutionStageInfo'
    { _jesiStepName :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobExecutionStageInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jesiStepName'
jobExecutionStageInfo
    :: JobExecutionStageInfo
jobExecutionStageInfo =
    JobExecutionStageInfo'
    { _jesiStepName = Nothing
    }

-- | The steps associated with the execution stage. Note that stages may have
-- several steps, and that a given step might be run by more than one
-- stage.
jesiStepName :: Lens' JobExecutionStageInfo [Text]
jesiStepName
  = lens _jesiStepName (\ s a -> s{_jesiStepName = a})
      . _Default
      . _Coerce

instance FromJSON JobExecutionStageInfo where
        parseJSON
          = withObject "JobExecutionStageInfo"
              (\ o ->
                 JobExecutionStageInfo' <$>
                   (o .:? "stepName" .!= mempty))

instance ToJSON JobExecutionStageInfo where
        toJSON JobExecutionStageInfo'{..}
          = object
              (catMaybes [("stepName" .=) <$> _jesiStepName])

-- | An output of an instruction.
--
-- /See:/ 'instructionOutput' smart constructor.
data InstructionOutput = InstructionOutput'
    { _ioOnlyCountValueBytes :: !(Maybe Bool)
    , _ioCodec               :: !(Maybe InstructionOutputCodec)
    , _ioName                :: !(Maybe Text)
    , _ioSystemName          :: !(Maybe Text)
    , _ioOriginalName        :: !(Maybe Text)
    , _ioOnlyCountKeyBytes   :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'InstructionOutput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ioOnlyCountValueBytes'
--
-- * 'ioCodec'
--
-- * 'ioName'
--
-- * 'ioSystemName'
--
-- * 'ioOriginalName'
--
-- * 'ioOnlyCountKeyBytes'
instructionOutput
    :: InstructionOutput
instructionOutput =
    InstructionOutput'
    { _ioOnlyCountValueBytes = Nothing
    , _ioCodec = Nothing
    , _ioName = Nothing
    , _ioSystemName = Nothing
    , _ioOriginalName = Nothing
    , _ioOnlyCountKeyBytes = Nothing
    }

-- | For system-generated byte and mean byte metrics, certain instructions
-- should only report the value size.
ioOnlyCountValueBytes :: Lens' InstructionOutput (Maybe Bool)
ioOnlyCountValueBytes
  = lens _ioOnlyCountValueBytes
      (\ s a -> s{_ioOnlyCountValueBytes = a})

-- | The codec to use to encode data being written via this output.
ioCodec :: Lens' InstructionOutput (Maybe InstructionOutputCodec)
ioCodec = lens _ioCodec (\ s a -> s{_ioCodec = a})

-- | The user-provided name of this output.
ioName :: Lens' InstructionOutput (Maybe Text)
ioName = lens _ioName (\ s a -> s{_ioName = a})

-- | System-defined name of this output. Unique across the workflow.
ioSystemName :: Lens' InstructionOutput (Maybe Text)
ioSystemName
  = lens _ioSystemName (\ s a -> s{_ioSystemName = a})

-- | System-defined name for this output in the original workflow graph.
-- Outputs that do not contribute to an original instruction do not set
-- this.
ioOriginalName :: Lens' InstructionOutput (Maybe Text)
ioOriginalName
  = lens _ioOriginalName
      (\ s a -> s{_ioOriginalName = a})

-- | For system-generated byte and mean byte metrics, certain instructions
-- should only report the key size.
ioOnlyCountKeyBytes :: Lens' InstructionOutput (Maybe Bool)
ioOnlyCountKeyBytes
  = lens _ioOnlyCountKeyBytes
      (\ s a -> s{_ioOnlyCountKeyBytes = a})

instance FromJSON InstructionOutput where
        parseJSON
          = withObject "InstructionOutput"
              (\ o ->
                 InstructionOutput' <$>
                   (o .:? "onlyCountValueBytes") <*> (o .:? "codec") <*>
                     (o .:? "name")
                     <*> (o .:? "systemName")
                     <*> (o .:? "originalName")
                     <*> (o .:? "onlyCountKeyBytes"))

instance ToJSON InstructionOutput where
        toJSON InstructionOutput'{..}
          = object
              (catMaybes
                 [("onlyCountValueBytes" .=) <$>
                    _ioOnlyCountValueBytes,
                  ("codec" .=) <$> _ioCodec, ("name" .=) <$> _ioName,
                  ("systemName" .=) <$> _ioSystemName,
                  ("originalName" .=) <$> _ioOriginalName,
                  ("onlyCountKeyBytes" .=) <$> _ioOnlyCountKeyBytes])

-- | Request to report the status of WorkItems.
--
-- /See:/ 'reportWorkItemStatusRequest' smart constructor.
data ReportWorkItemStatusRequest = ReportWorkItemStatusRequest'
    { _rwisrCurrentWorkerTime :: !(Maybe Text)
    , _rwisrLocation          :: !(Maybe Text)
    , _rwisrWorkItemStatuses  :: !(Maybe [WorkItemStatus])
    , _rwisrWorkerId          :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ReportWorkItemStatusRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rwisrCurrentWorkerTime'
--
-- * 'rwisrLocation'
--
-- * 'rwisrWorkItemStatuses'
--
-- * 'rwisrWorkerId'
reportWorkItemStatusRequest
    :: ReportWorkItemStatusRequest
reportWorkItemStatusRequest =
    ReportWorkItemStatusRequest'
    { _rwisrCurrentWorkerTime = Nothing
    , _rwisrLocation = Nothing
    , _rwisrWorkItemStatuses = Nothing
    , _rwisrWorkerId = Nothing
    }

-- | The current timestamp at the worker.
rwisrCurrentWorkerTime :: Lens' ReportWorkItemStatusRequest (Maybe Text)
rwisrCurrentWorkerTime
  = lens _rwisrCurrentWorkerTime
      (\ s a -> s{_rwisrCurrentWorkerTime = a})

-- | The location which contains the WorkItem\'s job.
rwisrLocation :: Lens' ReportWorkItemStatusRequest (Maybe Text)
rwisrLocation
  = lens _rwisrLocation
      (\ s a -> s{_rwisrLocation = a})

-- | The order is unimportant, except that the order of the
-- WorkItemServiceState messages in the ReportWorkItemStatusResponse
-- corresponds to the order of WorkItemStatus messages here.
rwisrWorkItemStatuses :: Lens' ReportWorkItemStatusRequest [WorkItemStatus]
rwisrWorkItemStatuses
  = lens _rwisrWorkItemStatuses
      (\ s a -> s{_rwisrWorkItemStatuses = a})
      . _Default
      . _Coerce

-- | The ID of the worker reporting the WorkItem status. If this does not
-- match the ID of the worker which the Dataflow service believes currently
-- has the lease on the WorkItem, the report will be dropped (with an error
-- response).
rwisrWorkerId :: Lens' ReportWorkItemStatusRequest (Maybe Text)
rwisrWorkerId
  = lens _rwisrWorkerId
      (\ s a -> s{_rwisrWorkerId = a})

instance FromJSON ReportWorkItemStatusRequest where
        parseJSON
          = withObject "ReportWorkItemStatusRequest"
              (\ o ->
                 ReportWorkItemStatusRequest' <$>
                   (o .:? "currentWorkerTime") <*> (o .:? "location")
                     <*> (o .:? "workItemStatuses" .!= mempty)
                     <*> (o .:? "workerId"))

instance ToJSON ReportWorkItemStatusRequest where
        toJSON ReportWorkItemStatusRequest'{..}
          = object
              (catMaybes
                 [("currentWorkerTime" .=) <$>
                    _rwisrCurrentWorkerTime,
                  ("location" .=) <$> _rwisrLocation,
                  ("workItemStatuses" .=) <$> _rwisrWorkItemStatuses,
                  ("workerId" .=) <$> _rwisrWorkerId])

-- | A structure describing which components and their versions of the
-- service are required in order to run the job.
--
-- /See:/ 'environmentVersion' smart constructor.
newtype EnvironmentVersion = EnvironmentVersion'
    { _evAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'EnvironmentVersion' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'evAddtional'
environmentVersion
    :: HashMap Text JSONValue -- ^ 'evAddtional'
    -> EnvironmentVersion
environmentVersion pEvAddtional_ =
    EnvironmentVersion'
    { _evAddtional = _Coerce # pEvAddtional_
    }

-- | Properties of the object.
evAddtional :: Lens' EnvironmentVersion (HashMap Text JSONValue)
evAddtional
  = lens _evAddtional (\ s a -> s{_evAddtional = a}) .
      _Coerce

instance FromJSON EnvironmentVersion where
        parseJSON
          = withObject "EnvironmentVersion"
              (\ o -> EnvironmentVersion' <$> (parseJSONObject o))

instance ToJSON EnvironmentVersion where
        toJSON = toJSON . _evAddtional

-- | A sink that records can be encoded and written to.
--
-- /See:/ 'sink' smart constructor.
data Sink = Sink'
    { _sCodec :: !(Maybe SinkCodec)
    , _sSpec  :: !(Maybe SinkSpec)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Sink' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sCodec'
--
-- * 'sSpec'
sink
    :: Sink
sink =
    Sink'
    { _sCodec = Nothing
    , _sSpec = Nothing
    }

-- | The codec to use to encode data written to the sink.
sCodec :: Lens' Sink (Maybe SinkCodec)
sCodec = lens _sCodec (\ s a -> s{_sCodec = a})

-- | The sink to write to, plus its parameters.
sSpec :: Lens' Sink (Maybe SinkSpec)
sSpec = lens _sSpec (\ s a -> s{_sSpec = a})

instance FromJSON Sink where
        parseJSON
          = withObject "Sink"
              (\ o -> Sink' <$> (o .:? "codec") <*> (o .:? "spec"))

instance ToJSON Sink where
        toJSON Sink'{..}
          = object
              (catMaybes
                 [("codec" .=) <$> _sCodec, ("spec" .=) <$> _sSpec])

-- | A metric value representing a list of strings.
--
-- /See:/ 'stringList' smart constructor.
newtype StringList = StringList'
    { _slElements :: Maybe [Text]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StringList' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'slElements'
stringList
    :: StringList
stringList =
    StringList'
    { _slElements = Nothing
    }

-- | Elements of the list.
slElements :: Lens' StringList [Text]
slElements
  = lens _slElements (\ s a -> s{_slElements = a}) .
      _Default
      . _Coerce

instance FromJSON StringList where
        parseJSON
          = withObject "StringList"
              (\ o ->
                 StringList' <$> (o .:? "elements" .!= mempty))

instance ToJSON StringList where
        toJSON StringList'{..}
          = object
              (catMaybes [("elements" .=) <$> _slElements])

-- | WorkerHealthReportResponse contains information returned to the worker
-- in response to a health ping.
--
-- /See:/ 'workerHealthReportResponse' smart constructor.
newtype WorkerHealthReportResponse = WorkerHealthReportResponse'
    { _whrrReportInterval :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerHealthReportResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'whrrReportInterval'
workerHealthReportResponse
    :: WorkerHealthReportResponse
workerHealthReportResponse =
    WorkerHealthReportResponse'
    { _whrrReportInterval = Nothing
    }

-- | A positive value indicates the worker should change its reporting
-- interval to the specified value. The default value of zero means no
-- change in report rate is requested by the server.
whrrReportInterval :: Lens' WorkerHealthReportResponse (Maybe Text)
whrrReportInterval
  = lens _whrrReportInterval
      (\ s a -> s{_whrrReportInterval = a})

instance FromJSON WorkerHealthReportResponse where
        parseJSON
          = withObject "WorkerHealthReportResponse"
              (\ o ->
                 WorkerHealthReportResponse' <$>
                   (o .:? "reportInterval"))

instance ToJSON WorkerHealthReportResponse where
        toJSON WorkerHealthReportResponse'{..}
          = object
              (catMaybes
                 [("reportInterval" .=) <$> _whrrReportInterval])

-- | Response to a send capture request. nothing
--
-- /See:/ 'sendDebugCaptureResponse' smart constructor.
data SendDebugCaptureResponse =
    SendDebugCaptureResponse'
    deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SendDebugCaptureResponse' with the minimum fields required to make a request.
--
sendDebugCaptureResponse
    :: SendDebugCaptureResponse
sendDebugCaptureResponse = SendDebugCaptureResponse'

instance FromJSON SendDebugCaptureResponse where
        parseJSON
          = withObject "SendDebugCaptureResponse"
              (\ o -> pure SendDebugCaptureResponse')

instance ToJSON SendDebugCaptureResponse where
        toJSON = const emptyObject

-- | User-defined labels for this job. The labels map can contain no more
-- than 64 entries. Entries of the labels map are UTF8 strings that comply
-- with the following restrictions: * Keys must conform to regexp:
-- \\p{Ll}\\p{Lo}{0,62} * Values must conform to regexp:
-- [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} * Both keys and values are additionally
-- constrained to be \<= 128 bytes in size.
--
-- /See:/ 'jobLabels' smart constructor.
newtype JobLabels = JobLabels'
    { _jlAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jlAddtional'
jobLabels
    :: HashMap Text Text -- ^ 'jlAddtional'
    -> JobLabels
jobLabels pJlAddtional_ =
    JobLabels'
    { _jlAddtional = _Coerce # pJlAddtional_
    }

jlAddtional :: Lens' JobLabels (HashMap Text Text)
jlAddtional
  = lens _jlAddtional (\ s a -> s{_jlAddtional = a}) .
      _Coerce

instance FromJSON JobLabels where
        parseJSON
          = withObject "JobLabels"
              (\ o -> JobLabels' <$> (parseJSONObject o))

instance ToJSON JobLabels where
        toJSON = toJSON . _jlAddtional

-- | Identifies a metric, by describing the source which generated the
-- metric.
--
-- /See:/ 'metricStructuredName' smart constructor.
data MetricStructuredName = MetricStructuredName'
    { _msnOrigin  :: !(Maybe Text)
    , _msnContext :: !(Maybe MetricStructuredNameContext)
    , _msnName    :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MetricStructuredName' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'msnOrigin'
--
-- * 'msnContext'
--
-- * 'msnName'
metricStructuredName
    :: MetricStructuredName
metricStructuredName =
    MetricStructuredName'
    { _msnOrigin = Nothing
    , _msnContext = Nothing
    , _msnName = Nothing
    }

-- | Origin (namespace) of metric name. May be blank for user-define metrics;
-- will be \"dataflow\" for metrics defined by the Dataflow service or SDK.
msnOrigin :: Lens' MetricStructuredName (Maybe Text)
msnOrigin
  = lens _msnOrigin (\ s a -> s{_msnOrigin = a})

-- | Zero or more labeled fields which identify the part of the job this
-- metric is associated with, such as the name of a step or collection. For
-- example, built-in counters associated with steps will have
-- context[\'step\'] = . Counters associated with PCollections in the SDK
-- will have context[\'pcollection\'] = .
msnContext :: Lens' MetricStructuredName (Maybe MetricStructuredNameContext)
msnContext
  = lens _msnContext (\ s a -> s{_msnContext = a})

-- | Worker-defined metric name.
msnName :: Lens' MetricStructuredName (Maybe Text)
msnName = lens _msnName (\ s a -> s{_msnName = a})

instance FromJSON MetricStructuredName where
        parseJSON
          = withObject "MetricStructuredName"
              (\ o ->
                 MetricStructuredName' <$>
                   (o .:? "origin") <*> (o .:? "context") <*>
                     (o .:? "name"))

instance ToJSON MetricStructuredName where
        toJSON MetricStructuredName'{..}
          = object
              (catMaybes
                 [("origin" .=) <$> _msnOrigin,
                  ("context" .=) <$> _msnContext,
                  ("name" .=) <$> _msnName])

-- | Identifies a counter within a per-job namespace. Counters whose
-- structured names are the same get merged into a single value for the
-- job.
--
-- /See:/ 'counterStructuredName' smart constructor.
data CounterStructuredName = CounterStructuredName'
    { _csnStandardOrigin    :: !(Maybe Text)
    , _csnComponentStepName :: !(Maybe Text)
    , _csnOtherOrigin       :: !(Maybe Text)
    , _csnPortion           :: !(Maybe Text)
    , _csnOriginalStepName  :: !(Maybe Text)
    , _csnName              :: !(Maybe Text)
    , _csnExecutionStepName :: !(Maybe Text)
    , _csnWorkerId          :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CounterStructuredName' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'csnStandardOrigin'
--
-- * 'csnComponentStepName'
--
-- * 'csnOtherOrigin'
--
-- * 'csnPortion'
--
-- * 'csnOriginalStepName'
--
-- * 'csnName'
--
-- * 'csnExecutionStepName'
--
-- * 'csnWorkerId'
counterStructuredName
    :: CounterStructuredName
counterStructuredName =
    CounterStructuredName'
    { _csnStandardOrigin = Nothing
    , _csnComponentStepName = Nothing
    , _csnOtherOrigin = Nothing
    , _csnPortion = Nothing
    , _csnOriginalStepName = Nothing
    , _csnName = Nothing
    , _csnExecutionStepName = Nothing
    , _csnWorkerId = Nothing
    }

-- | One of the standard Origins defined above.
csnStandardOrigin :: Lens' CounterStructuredName (Maybe Text)
csnStandardOrigin
  = lens _csnStandardOrigin
      (\ s a -> s{_csnStandardOrigin = a})

-- | Name of the optimized step being executed by the workers.
csnComponentStepName :: Lens' CounterStructuredName (Maybe Text)
csnComponentStepName
  = lens _csnComponentStepName
      (\ s a -> s{_csnComponentStepName = a})

-- | A string containing the origin of the counter.
csnOtherOrigin :: Lens' CounterStructuredName (Maybe Text)
csnOtherOrigin
  = lens _csnOtherOrigin
      (\ s a -> s{_csnOtherOrigin = a})

-- | Portion of this counter, either key or value.
csnPortion :: Lens' CounterStructuredName (Maybe Text)
csnPortion
  = lens _csnPortion (\ s a -> s{_csnPortion = a})

-- | System generated name of the original step in the user\'s graph, before
-- optimization.
csnOriginalStepName :: Lens' CounterStructuredName (Maybe Text)
csnOriginalStepName
  = lens _csnOriginalStepName
      (\ s a -> s{_csnOriginalStepName = a})

-- | Counter name. Not necessarily globally-unique, but unique within the
-- context of the other fields. Required.
csnName :: Lens' CounterStructuredName (Maybe Text)
csnName = lens _csnName (\ s a -> s{_csnName = a})

-- | Name of the stage. An execution step contains multiple component steps.
csnExecutionStepName :: Lens' CounterStructuredName (Maybe Text)
csnExecutionStepName
  = lens _csnExecutionStepName
      (\ s a -> s{_csnExecutionStepName = a})

-- | ID of a particular worker.
csnWorkerId :: Lens' CounterStructuredName (Maybe Text)
csnWorkerId
  = lens _csnWorkerId (\ s a -> s{_csnWorkerId = a})

instance FromJSON CounterStructuredName where
        parseJSON
          = withObject "CounterStructuredName"
              (\ o ->
                 CounterStructuredName' <$>
                   (o .:? "standardOrigin") <*>
                     (o .:? "componentStepName")
                     <*> (o .:? "otherOrigin")
                     <*> (o .:? "portion")
                     <*> (o .:? "originalStepName")
                     <*> (o .:? "name")
                     <*> (o .:? "executionStepName")
                     <*> (o .:? "workerId"))

instance ToJSON CounterStructuredName where
        toJSON CounterStructuredName'{..}
          = object
              (catMaybes
                 [("standardOrigin" .=) <$> _csnStandardOrigin,
                  ("componentStepName" .=) <$> _csnComponentStepName,
                  ("otherOrigin" .=) <$> _csnOtherOrigin,
                  ("portion" .=) <$> _csnPortion,
                  ("originalStepName" .=) <$> _csnOriginalStepName,
                  ("name" .=) <$> _csnName,
                  ("executionStepName" .=) <$> _csnExecutionStepName,
                  ("workerId" .=) <$> _csnWorkerId])

-- | An instruction that writes records. Takes one input, produces no
-- outputs.
--
-- /See:/ 'writeInstruction' smart constructor.
data WriteInstruction = WriteInstruction'
    { _wiSink  :: !(Maybe Sink)
    , _wiInput :: !(Maybe InstructionInput)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WriteInstruction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wiSink'
--
-- * 'wiInput'
writeInstruction
    :: WriteInstruction
writeInstruction =
    WriteInstruction'
    { _wiSink = Nothing
    , _wiInput = Nothing
    }

-- | The sink to write to.
wiSink :: Lens' WriteInstruction (Maybe Sink)
wiSink = lens _wiSink (\ s a -> s{_wiSink = a})

-- | The input.
wiInput :: Lens' WriteInstruction (Maybe InstructionInput)
wiInput = lens _wiInput (\ s a -> s{_wiInput = a})

instance FromJSON WriteInstruction where
        parseJSON
          = withObject "WriteInstruction"
              (\ o ->
                 WriteInstruction' <$>
                   (o .:? "sink") <*> (o .:? "input"))

instance ToJSON WriteInstruction where
        toJSON WriteInstruction'{..}
          = object
              (catMaybes
                 [("sink" .=) <$> _wiSink, ("input" .=) <$> _wiInput])

-- | A description of the process that generated the request.
--
-- /See:/ 'environmentUserAgent' smart constructor.
newtype EnvironmentUserAgent = EnvironmentUserAgent'
    { _euaAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'EnvironmentUserAgent' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'euaAddtional'
environmentUserAgent
    :: HashMap Text JSONValue -- ^ 'euaAddtional'
    -> EnvironmentUserAgent
environmentUserAgent pEuaAddtional_ =
    EnvironmentUserAgent'
    { _euaAddtional = _Coerce # pEuaAddtional_
    }

-- | Properties of the object.
euaAddtional :: Lens' EnvironmentUserAgent (HashMap Text JSONValue)
euaAddtional
  = lens _euaAddtional (\ s a -> s{_euaAddtional = a})
      . _Coerce

instance FromJSON EnvironmentUserAgent where
        parseJSON
          = withObject "EnvironmentUserAgent"
              (\ o ->
                 EnvironmentUserAgent' <$> (parseJSONObject o))

instance ToJSON EnvironmentUserAgent where
        toJSON = toJSON . _euaAddtional

-- | Describes the data disk used by a workflow job.
--
-- /See:/ 'disk' smart constructor.
data Disk = Disk'
    { _dSizeGb     :: !(Maybe (Textual Int32))
    , _dDiskType   :: !(Maybe Text)
    , _dMountPoint :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Disk' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dSizeGb'
--
-- * 'dDiskType'
--
-- * 'dMountPoint'
disk
    :: Disk
disk =
    Disk'
    { _dSizeGb = Nothing
    , _dDiskType = Nothing
    , _dMountPoint = Nothing
    }

-- | Size of disk in GB. If zero or unspecified, the service will attempt to
-- choose a reasonable default.
dSizeGb :: Lens' Disk (Maybe Int32)
dSizeGb
  = lens _dSizeGb (\ s a -> s{_dSizeGb = a}) .
      mapping _Coerce

-- | Disk storage type, as defined by Google Compute Engine. This must be a
-- disk type appropriate to the project and zone in which the workers will
-- run. If unknown or unspecified, the service will attempt to choose a
-- reasonable default. For example, the standard persistent disk type is a
-- resource name typically ending in \"pd-standard\". If SSD persistent
-- disks are available, the resource name typically ends with \"pd-ssd\".
-- The actual valid values are defined the Google Compute Engine API, not
-- by the Cloud Dataflow API; consult the Google Compute Engine
-- documentation for more information about determining the set of
-- available disk types for a particular project and zone. Google Compute
-- Engine Disk types are local to a particular project in a particular
-- zone, and so the resource name will typically look something like this:
-- compute.googleapis.com\/projects\/project-id\/zones\/zone\/diskTypes\/pd-standard
dDiskType :: Lens' Disk (Maybe Text)
dDiskType
  = lens _dDiskType (\ s a -> s{_dDiskType = a})

-- | Directory in a VM where disk is mounted.
dMountPoint :: Lens' Disk (Maybe Text)
dMountPoint
  = lens _dMountPoint (\ s a -> s{_dMountPoint = a})

instance FromJSON Disk where
        parseJSON
          = withObject "Disk"
              (\ o ->
                 Disk' <$>
                   (o .:? "sizeGb") <*> (o .:? "diskType") <*>
                     (o .:? "mountPoint"))

instance ToJSON Disk where
        toJSON Disk'{..}
          = object
              (catMaybes
                 [("sizeGb" .=) <$> _dSizeGb,
                  ("diskType" .=) <$> _dDiskType,
                  ("mountPoint" .=) <$> _dMountPoint])

-- | Describes the state of a metric.
--
-- /See:/ 'metricUpdate' smart constructor.
data MetricUpdate = MetricUpdate'
    { _muMeanSum    :: !(Maybe JSONValue)
    , _muInternal   :: !(Maybe JSONValue)
    , _muSet        :: !(Maybe JSONValue)
    , _muCumulative :: !(Maybe Bool)
    , _muKind       :: !(Maybe Text)
    , _muUpdateTime :: !(Maybe Text)
    , _muMeanCount  :: !(Maybe JSONValue)
    , _muName       :: !(Maybe MetricStructuredName)
    , _muScalar     :: !(Maybe JSONValue)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MetricUpdate' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'muMeanSum'
--
-- * 'muInternal'
--
-- * 'muSet'
--
-- * 'muCumulative'
--
-- * 'muKind'
--
-- * 'muUpdateTime'
--
-- * 'muMeanCount'
--
-- * 'muName'
--
-- * 'muScalar'
metricUpdate
    :: MetricUpdate
metricUpdate =
    MetricUpdate'
    { _muMeanSum = Nothing
    , _muInternal = Nothing
    , _muSet = Nothing
    , _muCumulative = Nothing
    , _muKind = Nothing
    , _muUpdateTime = Nothing
    , _muMeanCount = Nothing
    , _muName = Nothing
    , _muScalar = Nothing
    }

-- | Worker-computed aggregate value for the \"Mean\" aggregation kind. This
-- holds the sum of the aggregated values and is used in combination with
-- mean_count below to obtain the actual mean aggregate value. The only
-- possible value types are Long and Double.
muMeanSum :: Lens' MetricUpdate (Maybe JSONValue)
muMeanSum
  = lens _muMeanSum (\ s a -> s{_muMeanSum = a})

-- | Worker-computed aggregate value for internal use by the Dataflow
-- service.
muInternal :: Lens' MetricUpdate (Maybe JSONValue)
muInternal
  = lens _muInternal (\ s a -> s{_muInternal = a})

-- | Worker-computed aggregate value for the \"Set\" aggregation kind. The
-- only possible value type is a list of Values whose type can be Long,
-- Double, or String, according to the metric\'s type. All Values in the
-- list must be of the same type.
muSet :: Lens' MetricUpdate (Maybe JSONValue)
muSet = lens _muSet (\ s a -> s{_muSet = a})

-- | True if this metric is reported as the total cumulative aggregate value
-- accumulated since the worker started working on this WorkItem. By
-- default this is false, indicating that this metric is reported as a
-- delta that is not associated with any WorkItem.
muCumulative :: Lens' MetricUpdate (Maybe Bool)
muCumulative
  = lens _muCumulative (\ s a -> s{_muCumulative = a})

-- | Metric aggregation kind. The possible metric aggregation kinds are
-- \"Sum\", \"Max\", \"Min\", \"Mean\", \"Set\", \"And\", and \"Or\". The
-- specified aggregation kind is case-insensitive. If omitted, this is not
-- an aggregated value but instead a single metric sample value.
muKind :: Lens' MetricUpdate (Maybe Text)
muKind = lens _muKind (\ s a -> s{_muKind = a})

-- | Timestamp associated with the metric value. Optional when workers are
-- reporting work progress; it will be filled in responses from the metrics
-- API.
muUpdateTime :: Lens' MetricUpdate (Maybe Text)
muUpdateTime
  = lens _muUpdateTime (\ s a -> s{_muUpdateTime = a})

-- | Worker-computed aggregate value for the \"Mean\" aggregation kind. This
-- holds the count of the aggregated values and is used in combination with
-- mean_sum above to obtain the actual mean aggregate value. The only
-- possible value type is Long.
muMeanCount :: Lens' MetricUpdate (Maybe JSONValue)
muMeanCount
  = lens _muMeanCount (\ s a -> s{_muMeanCount = a})

-- | Name of the metric.
muName :: Lens' MetricUpdate (Maybe MetricStructuredName)
muName = lens _muName (\ s a -> s{_muName = a})

-- | Worker-computed aggregate value for aggregation kinds \"Sum\", \"Max\",
-- \"Min\", \"And\", and \"Or\". The possible value types are Long, Double,
-- and Boolean.
muScalar :: Lens' MetricUpdate (Maybe JSONValue)
muScalar = lens _muScalar (\ s a -> s{_muScalar = a})

instance FromJSON MetricUpdate where
        parseJSON
          = withObject "MetricUpdate"
              (\ o ->
                 MetricUpdate' <$>
                   (o .:? "meanSum") <*> (o .:? "internal") <*>
                     (o .:? "set")
                     <*> (o .:? "cumulative")
                     <*> (o .:? "kind")
                     <*> (o .:? "updateTime")
                     <*> (o .:? "meanCount")
                     <*> (o .:? "name")
                     <*> (o .:? "scalar"))

instance ToJSON MetricUpdate where
        toJSON MetricUpdate'{..}
          = object
              (catMaybes
                 [("meanSum" .=) <$> _muMeanSum,
                  ("internal" .=) <$> _muInternal,
                  ("set" .=) <$> _muSet,
                  ("cumulative" .=) <$> _muCumulative,
                  ("kind" .=) <$> _muKind,
                  ("updateTime" .=) <$> _muUpdateTime,
                  ("meanCount" .=) <$> _muMeanCount,
                  ("name" .=) <$> _muName,
                  ("scalar" .=) <$> _muScalar])

-- | The result of a SourceGetMetadataOperation.
--
-- /See:/ 'sourceGetMetadataResponse' smart constructor.
newtype SourceGetMetadataResponse = SourceGetMetadataResponse'
    { _sgmrMetadata :: Maybe SourceMetadata
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceGetMetadataResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sgmrMetadata'
sourceGetMetadataResponse
    :: SourceGetMetadataResponse
sourceGetMetadataResponse =
    SourceGetMetadataResponse'
    { _sgmrMetadata = Nothing
    }

-- | The computed metadata.
sgmrMetadata :: Lens' SourceGetMetadataResponse (Maybe SourceMetadata)
sgmrMetadata
  = lens _sgmrMetadata (\ s a -> s{_sgmrMetadata = a})

instance FromJSON SourceGetMetadataResponse where
        parseJSON
          = withObject "SourceGetMetadataResponse"
              (\ o ->
                 SourceGetMetadataResponse' <$> (o .:? "metadata"))

instance ToJSON SourceGetMetadataResponse where
        toJSON SourceGetMetadataResponse'{..}
          = object
              (catMaybes [("metadata" .=) <$> _sgmrMetadata])

-- | Describes the environment in which a Dataflow Job runs.
--
-- /See:/ 'environment' smart constructor.
data Environment = Environment'
    { _eDataSet                  :: !(Maybe Text)
    , _eExperiments              :: !(Maybe [Text])
    , _eWorkerPools              :: !(Maybe [WorkerPool])
    , _eClusterManagerAPIService :: !(Maybe Text)
    , _eVersion                  :: !(Maybe EnvironmentVersion)
    , _eInternalExperiments      :: !(Maybe EnvironmentInternalExperiments)
    , _eTempStoragePrefix        :: !(Maybe Text)
    , _eServiceAccountEmail      :: !(Maybe Text)
    , _eUserAgent                :: !(Maybe EnvironmentUserAgent)
    , _eSdkPipelineOptions       :: !(Maybe EnvironmentSdkPipelineOptions)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Environment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eDataSet'
--
-- * 'eExperiments'
--
-- * 'eWorkerPools'
--
-- * 'eClusterManagerAPIService'
--
-- * 'eVersion'
--
-- * 'eInternalExperiments'
--
-- * 'eTempStoragePrefix'
--
-- * 'eServiceAccountEmail'
--
-- * 'eUserAgent'
--
-- * 'eSdkPipelineOptions'
environment
    :: Environment
environment =
    Environment'
    { _eDataSet = Nothing
    , _eExperiments = Nothing
    , _eWorkerPools = Nothing
    , _eClusterManagerAPIService = Nothing
    , _eVersion = Nothing
    , _eInternalExperiments = Nothing
    , _eTempStoragePrefix = Nothing
    , _eServiceAccountEmail = Nothing
    , _eUserAgent = Nothing
    , _eSdkPipelineOptions = Nothing
    }

-- | The dataset for the current project where various workflow related
-- tables are stored. The supported resource type is: Google BigQuery:
-- bigquery.googleapis.com\/{dataset}
eDataSet :: Lens' Environment (Maybe Text)
eDataSet = lens _eDataSet (\ s a -> s{_eDataSet = a})

-- | The list of experiments to enable.
eExperiments :: Lens' Environment [Text]
eExperiments
  = lens _eExperiments (\ s a -> s{_eExperiments = a})
      . _Default
      . _Coerce

-- | The worker pools. At least one \"harness\" worker pool must be specified
-- in order for the job to have workers.
eWorkerPools :: Lens' Environment [WorkerPool]
eWorkerPools
  = lens _eWorkerPools (\ s a -> s{_eWorkerPools = a})
      . _Default
      . _Coerce

-- | The type of cluster manager API to use. If unknown or unspecified, the
-- service will attempt to choose a reasonable default. This should be in
-- the form of the API service name, e.g. \"compute.googleapis.com\".
eClusterManagerAPIService :: Lens' Environment (Maybe Text)
eClusterManagerAPIService
  = lens _eClusterManagerAPIService
      (\ s a -> s{_eClusterManagerAPIService = a})

-- | A structure describing which components and their versions of the
-- service are required in order to run the job.
eVersion :: Lens' Environment (Maybe EnvironmentVersion)
eVersion = lens _eVersion (\ s a -> s{_eVersion = a})

-- | Experimental settings.
eInternalExperiments :: Lens' Environment (Maybe EnvironmentInternalExperiments)
eInternalExperiments
  = lens _eInternalExperiments
      (\ s a -> s{_eInternalExperiments = a})

-- | The prefix of the resources the system should use for temporary storage.
-- The system will append the suffix \"\/temp-{JOBNAME} to this resource
-- prefix, where {JOBNAME} is the value of the job_name field. The
-- resulting bucket and object prefix is used as the prefix of the
-- resources used to store temporary data needed during the job execution.
-- NOTE: This will override the value in taskrunner_settings. The supported
-- resource type is: Google Cloud Storage:
-- storage.googleapis.com\/{bucket}\/{object}
-- bucket.storage.googleapis.com\/{object}
eTempStoragePrefix :: Lens' Environment (Maybe Text)
eTempStoragePrefix
  = lens _eTempStoragePrefix
      (\ s a -> s{_eTempStoragePrefix = a})

-- | Identity to run virtual machines as. Defaults to the default account.
eServiceAccountEmail :: Lens' Environment (Maybe Text)
eServiceAccountEmail
  = lens _eServiceAccountEmail
      (\ s a -> s{_eServiceAccountEmail = a})

-- | A description of the process that generated the request.
eUserAgent :: Lens' Environment (Maybe EnvironmentUserAgent)
eUserAgent
  = lens _eUserAgent (\ s a -> s{_eUserAgent = a})

-- | The Cloud Dataflow SDK pipeline options specified by the user. These
-- options are passed through the service and are used to recreate the SDK
-- pipeline options on the worker in a language agnostic and platform
-- independent way.
eSdkPipelineOptions :: Lens' Environment (Maybe EnvironmentSdkPipelineOptions)
eSdkPipelineOptions
  = lens _eSdkPipelineOptions
      (\ s a -> s{_eSdkPipelineOptions = a})

instance FromJSON Environment where
        parseJSON
          = withObject "Environment"
              (\ o ->
                 Environment' <$>
                   (o .:? "dataset") <*>
                     (o .:? "experiments" .!= mempty)
                     <*> (o .:? "workerPools" .!= mempty)
                     <*> (o .:? "clusterManagerApiService")
                     <*> (o .:? "version")
                     <*> (o .:? "internalExperiments")
                     <*> (o .:? "tempStoragePrefix")
                     <*> (o .:? "serviceAccountEmail")
                     <*> (o .:? "userAgent")
                     <*> (o .:? "sdkPipelineOptions"))

instance ToJSON Environment where
        toJSON Environment'{..}
          = object
              (catMaybes
                 [("dataset" .=) <$> _eDataSet,
                  ("experiments" .=) <$> _eExperiments,
                  ("workerPools" .=) <$> _eWorkerPools,
                  ("clusterManagerApiService" .=) <$>
                    _eClusterManagerAPIService,
                  ("version" .=) <$> _eVersion,
                  ("internalExperiments" .=) <$> _eInternalExperiments,
                  ("tempStoragePrefix" .=) <$> _eTempStoragePrefix,
                  ("serviceAccountEmail" .=) <$> _eServiceAccountEmail,
                  ("userAgent" .=) <$> _eUserAgent,
                  ("sdkPipelineOptions" .=) <$> _eSdkPipelineOptions])

-- | A position that encapsulates an inner position and an index for the
-- inner position. A ConcatPosition can be used by a reader of a source
-- that encapsulates a set of other sources.
--
-- /See:/ 'concatPosition' smart constructor.
data ConcatPosition = ConcatPosition'
    { _cpIndex    :: !(Maybe (Textual Int32))
    , _cpPosition :: !(Maybe Position)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ConcatPosition' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cpIndex'
--
-- * 'cpPosition'
concatPosition
    :: ConcatPosition
concatPosition =
    ConcatPosition'
    { _cpIndex = Nothing
    , _cpPosition = Nothing
    }

-- | Index of the inner source.
cpIndex :: Lens' ConcatPosition (Maybe Int32)
cpIndex
  = lens _cpIndex (\ s a -> s{_cpIndex = a}) .
      mapping _Coerce

-- | Position within the inner source.
cpPosition :: Lens' ConcatPosition (Maybe Position)
cpPosition
  = lens _cpPosition (\ s a -> s{_cpPosition = a})

instance FromJSON ConcatPosition where
        parseJSON
          = withObject "ConcatPosition"
              (\ o ->
                 ConcatPosition' <$>
                   (o .:? "index") <*> (o .:? "position"))

instance ToJSON ConcatPosition where
        toJSON ConcatPosition'{..}
          = object
              (catMaybes
                 [("index" .=) <$> _cpIndex,
                  ("position" .=) <$> _cpPosition])

-- | Zero or more labeled fields which identify the part of the job this
-- metric is associated with, such as the name of a step or collection. For
-- example, built-in counters associated with steps will have
-- context[\'step\'] = . Counters associated with PCollections in the SDK
-- will have context[\'pcollection\'] = .
--
-- /See:/ 'metricStructuredNameContext' smart constructor.
newtype MetricStructuredNameContext = MetricStructuredNameContext'
    { _msncAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MetricStructuredNameContext' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'msncAddtional'
metricStructuredNameContext
    :: HashMap Text Text -- ^ 'msncAddtional'
    -> MetricStructuredNameContext
metricStructuredNameContext pMsncAddtional_ =
    MetricStructuredNameContext'
    { _msncAddtional = _Coerce # pMsncAddtional_
    }

msncAddtional :: Lens' MetricStructuredNameContext (HashMap Text Text)
msncAddtional
  = lens _msncAddtional
      (\ s a -> s{_msncAddtional = a})
      . _Coerce

instance FromJSON MetricStructuredNameContext where
        parseJSON
          = withObject "MetricStructuredNameContext"
              (\ o ->
                 MetricStructuredNameContext' <$> (parseJSONObject o))

instance ToJSON MetricStructuredNameContext where
        toJSON = toJSON . _msncAddtional

-- | An update to a Counter sent from a worker.
--
-- /See:/ 'counterUpdate' smart constructor.
data CounterUpdate = CounterUpdate'
    { _cuNameAndKind               :: !(Maybe NameAndKind)
    , _cuIntegerList               :: !(Maybe IntegerList)
    , _cuFloatingPoint             :: !(Maybe (Textual Double))
    , _cuInternal                  :: !(Maybe JSONValue)
    , _cuStringList                :: !(Maybe StringList)
    , _cuShortId                   :: !(Maybe (Textual Int64))
    , _cuDistribution              :: !(Maybe DistributionUpdate)
    , _cuCumulative                :: !(Maybe Bool)
    , _cuStructuredNameAndMetadata :: !(Maybe CounterStructuredNameAndMetadata)
    , _cuFloatingPointMean         :: !(Maybe FloatingPointMean)
    , _cuIntegerMean               :: !(Maybe IntegerMean)
    , _cuBoolean                   :: !(Maybe Bool)
    , _cuFloatingPointList         :: !(Maybe FloatingPointList)
    , _cuInteger                   :: !(Maybe SplitInt64)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CounterUpdate' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cuNameAndKind'
--
-- * 'cuIntegerList'
--
-- * 'cuFloatingPoint'
--
-- * 'cuInternal'
--
-- * 'cuStringList'
--
-- * 'cuShortId'
--
-- * 'cuDistribution'
--
-- * 'cuCumulative'
--
-- * 'cuStructuredNameAndMetadata'
--
-- * 'cuFloatingPointMean'
--
-- * 'cuIntegerMean'
--
-- * 'cuBoolean'
--
-- * 'cuFloatingPointList'
--
-- * 'cuInteger'
counterUpdate
    :: CounterUpdate
counterUpdate =
    CounterUpdate'
    { _cuNameAndKind = Nothing
    , _cuIntegerList = Nothing
    , _cuFloatingPoint = Nothing
    , _cuInternal = Nothing
    , _cuStringList = Nothing
    , _cuShortId = Nothing
    , _cuDistribution = Nothing
    , _cuCumulative = Nothing
    , _cuStructuredNameAndMetadata = Nothing
    , _cuFloatingPointMean = Nothing
    , _cuIntegerMean = Nothing
    , _cuBoolean = Nothing
    , _cuFloatingPointList = Nothing
    , _cuInteger = Nothing
    }

-- | Counter name and aggregation type.
cuNameAndKind :: Lens' CounterUpdate (Maybe NameAndKind)
cuNameAndKind
  = lens _cuNameAndKind
      (\ s a -> s{_cuNameAndKind = a})

-- | List of integers, for Set.
cuIntegerList :: Lens' CounterUpdate (Maybe IntegerList)
cuIntegerList
  = lens _cuIntegerList
      (\ s a -> s{_cuIntegerList = a})

-- | Floating point value for Sum, Max, Min.
cuFloatingPoint :: Lens' CounterUpdate (Maybe Double)
cuFloatingPoint
  = lens _cuFloatingPoint
      (\ s a -> s{_cuFloatingPoint = a})
      . mapping _Coerce

-- | Value for internally-defined counters used by the Dataflow service.
cuInternal :: Lens' CounterUpdate (Maybe JSONValue)
cuInternal
  = lens _cuInternal (\ s a -> s{_cuInternal = a})

-- | List of strings, for Set.
cuStringList :: Lens' CounterUpdate (Maybe StringList)
cuStringList
  = lens _cuStringList (\ s a -> s{_cuStringList = a})

-- | The service-generated short identifier for this counter. The short_id ->
-- (name, metadata) mapping is constant for the lifetime of a job.
cuShortId :: Lens' CounterUpdate (Maybe Int64)
cuShortId
  = lens _cuShortId (\ s a -> s{_cuShortId = a}) .
      mapping _Coerce

-- | Distribution data
cuDistribution :: Lens' CounterUpdate (Maybe DistributionUpdate)
cuDistribution
  = lens _cuDistribution
      (\ s a -> s{_cuDistribution = a})

-- | True if this counter is reported as the total cumulative aggregate value
-- accumulated since the worker started working on this WorkItem. By
-- default this is false, indicating that this counter is reported as a
-- delta.
cuCumulative :: Lens' CounterUpdate (Maybe Bool)
cuCumulative
  = lens _cuCumulative (\ s a -> s{_cuCumulative = a})

-- | Counter structured name and metadata.
cuStructuredNameAndMetadata :: Lens' CounterUpdate (Maybe CounterStructuredNameAndMetadata)
cuStructuredNameAndMetadata
  = lens _cuStructuredNameAndMetadata
      (\ s a -> s{_cuStructuredNameAndMetadata = a})

-- | Floating point mean aggregation value for Mean.
cuFloatingPointMean :: Lens' CounterUpdate (Maybe FloatingPointMean)
cuFloatingPointMean
  = lens _cuFloatingPointMean
      (\ s a -> s{_cuFloatingPointMean = a})

-- | Integer mean aggregation value for Mean.
cuIntegerMean :: Lens' CounterUpdate (Maybe IntegerMean)
cuIntegerMean
  = lens _cuIntegerMean
      (\ s a -> s{_cuIntegerMean = a})

-- | Boolean value for And, Or.
cuBoolean :: Lens' CounterUpdate (Maybe Bool)
cuBoolean
  = lens _cuBoolean (\ s a -> s{_cuBoolean = a})

-- | List of floating point numbers, for Set.
cuFloatingPointList :: Lens' CounterUpdate (Maybe FloatingPointList)
cuFloatingPointList
  = lens _cuFloatingPointList
      (\ s a -> s{_cuFloatingPointList = a})

-- | Integer value for Sum, Max, Min.
cuInteger :: Lens' CounterUpdate (Maybe SplitInt64)
cuInteger
  = lens _cuInteger (\ s a -> s{_cuInteger = a})

instance FromJSON CounterUpdate where
        parseJSON
          = withObject "CounterUpdate"
              (\ o ->
                 CounterUpdate' <$>
                   (o .:? "nameAndKind") <*> (o .:? "integerList") <*>
                     (o .:? "floatingPoint")
                     <*> (o .:? "internal")
                     <*> (o .:? "stringList")
                     <*> (o .:? "shortId")
                     <*> (o .:? "distribution")
                     <*> (o .:? "cumulative")
                     <*> (o .:? "structuredNameAndMetadata")
                     <*> (o .:? "floatingPointMean")
                     <*> (o .:? "integerMean")
                     <*> (o .:? "boolean")
                     <*> (o .:? "floatingPointList")
                     <*> (o .:? "integer"))

instance ToJSON CounterUpdate where
        toJSON CounterUpdate'{..}
          = object
              (catMaybes
                 [("nameAndKind" .=) <$> _cuNameAndKind,
                  ("integerList" .=) <$> _cuIntegerList,
                  ("floatingPoint" .=) <$> _cuFloatingPoint,
                  ("internal" .=) <$> _cuInternal,
                  ("stringList" .=) <$> _cuStringList,
                  ("shortId" .=) <$> _cuShortId,
                  ("distribution" .=) <$> _cuDistribution,
                  ("cumulative" .=) <$> _cuCumulative,
                  ("structuredNameAndMetadata" .=) <$>
                    _cuStructuredNameAndMetadata,
                  ("floatingPointMean" .=) <$> _cuFloatingPointMean,
                  ("integerMean" .=) <$> _cuIntegerMean,
                  ("boolean" .=) <$> _cuBoolean,
                  ("floatingPointList" .=) <$> _cuFloatingPointList,
                  ("integer" .=) <$> _cuInteger])

-- | Identifies the location of a streaming computation stage, for
-- stage-to-stage communication.
--
-- /See:/ 'streamingStageLocation' smart constructor.
newtype StreamingStageLocation = StreamingStageLocation'
    { _sslStreamId :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingStageLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sslStreamId'
streamingStageLocation
    :: StreamingStageLocation
streamingStageLocation =
    StreamingStageLocation'
    { _sslStreamId = Nothing
    }

-- | Identifies the particular stream within the streaming Dataflow job.
sslStreamId :: Lens' StreamingStageLocation (Maybe Text)
sslStreamId
  = lens _sslStreamId (\ s a -> s{_sslStreamId = a})

instance FromJSON StreamingStageLocation where
        parseJSON
          = withObject "StreamingStageLocation"
              (\ o ->
                 StreamingStageLocation' <$> (o .:? "streamId"))

instance ToJSON StreamingStageLocation where
        toJSON StreamingStageLocation'{..}
          = object
              (catMaybes [("streamId" .=) <$> _sslStreamId])

-- | Specification of one of the bundles produced as a result of splitting a
-- Source (e.g. when executing a SourceSplitRequest, or when splitting an
-- active task using WorkItemStatus.dynamic_source_split), relative to the
-- source being split.
--
-- /See:/ 'derivedSource' smart constructor.
data DerivedSource = DerivedSource'
    { _dsDerivationMode :: !(Maybe Text)
    , _dsSource         :: !(Maybe Source)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DerivedSource' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dsDerivationMode'
--
-- * 'dsSource'
derivedSource
    :: DerivedSource
derivedSource =
    DerivedSource'
    { _dsDerivationMode = Nothing
    , _dsSource = Nothing
    }

-- | What source to base the produced source on (if any).
dsDerivationMode :: Lens' DerivedSource (Maybe Text)
dsDerivationMode
  = lens _dsDerivationMode
      (\ s a -> s{_dsDerivationMode = a})

-- | Specification of the source.
dsSource :: Lens' DerivedSource (Maybe Source)
dsSource = lens _dsSource (\ s a -> s{_dsSource = a})

instance FromJSON DerivedSource where
        parseJSON
          = withObject "DerivedSource"
              (\ o ->
                 DerivedSource' <$>
                   (o .:? "derivationMode") <*> (o .:? "source"))

instance ToJSON DerivedSource where
        toJSON DerivedSource'{..}
          = object
              (catMaybes
                 [("derivationMode" .=) <$> _dsDerivationMode,
                  ("source" .=) <$> _dsSource])

-- | JobMetrics contains a collection of metrics descibing the detailed
-- progress of a Dataflow job. Metrics correspond to user-defined and
-- system-defined metrics in the job. This resource captures only the most
-- recent values of each metric; time-series data can be queried for them
-- (under the same metric names) from Cloud Monitoring.
--
-- /See:/ 'jobMetrics' smart constructor.
data JobMetrics = JobMetrics'
    { _jmMetrics    :: !(Maybe [MetricUpdate])
    , _jmMetricTime :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobMetrics' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jmMetrics'
--
-- * 'jmMetricTime'
jobMetrics
    :: JobMetrics
jobMetrics =
    JobMetrics'
    { _jmMetrics = Nothing
    , _jmMetricTime = Nothing
    }

-- | All metrics for this job.
jmMetrics :: Lens' JobMetrics [MetricUpdate]
jmMetrics
  = lens _jmMetrics (\ s a -> s{_jmMetrics = a}) .
      _Default
      . _Coerce

-- | Timestamp as of which metric values are current.
jmMetricTime :: Lens' JobMetrics (Maybe Text)
jmMetricTime
  = lens _jmMetricTime (\ s a -> s{_jmMetricTime = a})

instance FromJSON JobMetrics where
        parseJSON
          = withObject "JobMetrics"
              (\ o ->
                 JobMetrics' <$>
                   (o .:? "metrics" .!= mempty) <*>
                     (o .:? "metricTime"))

instance ToJSON JobMetrics where
        toJSON JobMetrics'{..}
          = object
              (catMaybes
                 [("metrics" .=) <$> _jmMetrics,
                  ("metricTime" .=) <$> _jmMetricTime])

-- | Request to send encoded debug information.
--
-- /See:/ 'sendDebugCaptureRequest' smart constructor.
data SendDebugCaptureRequest = SendDebugCaptureRequest'
    { _sdcrData        :: !(Maybe Text)
    , _sdcrComponentId :: !(Maybe Text)
    , _sdcrWorkerId    :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SendDebugCaptureRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sdcrData'
--
-- * 'sdcrComponentId'
--
-- * 'sdcrWorkerId'
sendDebugCaptureRequest
    :: SendDebugCaptureRequest
sendDebugCaptureRequest =
    SendDebugCaptureRequest'
    { _sdcrData = Nothing
    , _sdcrComponentId = Nothing
    , _sdcrWorkerId = Nothing
    }

-- | The encoded debug information.
sdcrData :: Lens' SendDebugCaptureRequest (Maybe Text)
sdcrData = lens _sdcrData (\ s a -> s{_sdcrData = a})

-- | The internal component id for which debug information is sent.
sdcrComponentId :: Lens' SendDebugCaptureRequest (Maybe Text)
sdcrComponentId
  = lens _sdcrComponentId
      (\ s a -> s{_sdcrComponentId = a})

-- | The worker id, i.e., VM hostname.
sdcrWorkerId :: Lens' SendDebugCaptureRequest (Maybe Text)
sdcrWorkerId
  = lens _sdcrWorkerId (\ s a -> s{_sdcrWorkerId = a})

instance FromJSON SendDebugCaptureRequest where
        parseJSON
          = withObject "SendDebugCaptureRequest"
              (\ o ->
                 SendDebugCaptureRequest' <$>
                   (o .:? "data") <*> (o .:? "componentId") <*>
                     (o .:? "workerId"))

instance ToJSON SendDebugCaptureRequest where
        toJSON SendDebugCaptureRequest'{..}
          = object
              (catMaybes
                 [("data" .=) <$> _sdcrData,
                  ("componentId" .=) <$> _sdcrComponentId,
                  ("workerId" .=) <$> _sdcrWorkerId])

-- | Conveys a worker\'s progress through the work described by a WorkItem.
--
-- /See:/ 'workItemStatus' smart constructor.
data WorkItemStatus = WorkItemStatus'
    { _wisReportedProgress        :: !(Maybe ApproximateReportedProgress)
    , _wisProgress                :: !(Maybe ApproximateProgress)
    , _wisSourceOperationResponse :: !(Maybe SourceOperationResponse)
    , _wisStopPosition            :: !(Maybe Position)
    , _wisDynamicSourceSplit      :: !(Maybe DynamicSourceSplit)
    , _wisCompleted               :: !(Maybe Bool)
    , _wisSourceFork              :: !(Maybe SourceFork)
    , _wisReportIndex             :: !(Maybe (Textual Int64))
    , _wisRequestedLeaseDuration  :: !(Maybe Text)
    , _wisErrors                  :: !(Maybe [Status])
    , _wisCounterUpdates          :: !(Maybe [CounterUpdate])
    , _wisMetricUpdates           :: !(Maybe [MetricUpdate])
    , _wisWorkItemId              :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkItemStatus' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wisReportedProgress'
--
-- * 'wisProgress'
--
-- * 'wisSourceOperationResponse'
--
-- * 'wisStopPosition'
--
-- * 'wisDynamicSourceSplit'
--
-- * 'wisCompleted'
--
-- * 'wisSourceFork'
--
-- * 'wisReportIndex'
--
-- * 'wisRequestedLeaseDuration'
--
-- * 'wisErrors'
--
-- * 'wisCounterUpdates'
--
-- * 'wisMetricUpdates'
--
-- * 'wisWorkItemId'
workItemStatus
    :: WorkItemStatus
workItemStatus =
    WorkItemStatus'
    { _wisReportedProgress = Nothing
    , _wisProgress = Nothing
    , _wisSourceOperationResponse = Nothing
    , _wisStopPosition = Nothing
    , _wisDynamicSourceSplit = Nothing
    , _wisCompleted = Nothing
    , _wisSourceFork = Nothing
    , _wisReportIndex = Nothing
    , _wisRequestedLeaseDuration = Nothing
    , _wisErrors = Nothing
    , _wisCounterUpdates = Nothing
    , _wisMetricUpdates = Nothing
    , _wisWorkItemId = Nothing
    }

-- | The worker\'s progress through this WorkItem.
wisReportedProgress :: Lens' WorkItemStatus (Maybe ApproximateReportedProgress)
wisReportedProgress
  = lens _wisReportedProgress
      (\ s a -> s{_wisReportedProgress = a})

-- | DEPRECATED in favor of reported_progress.
wisProgress :: Lens' WorkItemStatus (Maybe ApproximateProgress)
wisProgress
  = lens _wisProgress (\ s a -> s{_wisProgress = a})

-- | If the work item represented a SourceOperationRequest, and the work is
-- completed, contains the result of the operation.
wisSourceOperationResponse :: Lens' WorkItemStatus (Maybe SourceOperationResponse)
wisSourceOperationResponse
  = lens _wisSourceOperationResponse
      (\ s a -> s{_wisSourceOperationResponse = a})

-- | A worker may split an active map task in two parts, \"primary\" and
-- \"residual\", continuing to process the primary part and returning the
-- residual part into the pool of available work. This event is called a
-- \"dynamic split\" and is critical to the dynamic work rebalancing
-- feature. The two obtained sub-tasks are called \"parts\" of the split.
-- The parts, if concatenated, must represent the same input as would be
-- read by the current task if the split did not happen. The exact way in
-- which the original task is decomposed into the two parts is specified
-- either as a position demarcating them (stop_position), or explicitly as
-- two DerivedSources, if this task consumes a user-defined source type
-- (dynamic_source_split). The \"current\" task is adjusted as a result of
-- the split: after a task with range [A, B) sends a stop_position update
-- at C, its range is considered to be [A, C), e.g.: * Progress should be
-- interpreted relative to the new range, e.g. \"75% completed\" means
-- \"75% of [A, C) completed\" * The worker should interpret
-- proposed_stop_position relative to the new range, e.g. \"split at 68%\"
-- should be interpreted as \"split at 68% of [A, C)\". * If the worker
-- chooses to split again using stop_position, only stop_positions in [A,
-- C) will be accepted. * Etc. dynamic_source_split has similar semantics:
-- e.g., if a task with source S splits using dynamic_source_split into {P,
-- R} (where P and R must be together equivalent to S), then subsequent
-- progress and proposed_stop_position should be interpreted relative to P,
-- and in a potential subsequent dynamic_source_split into {P\', R\'}, P\'
-- and R\' must be together equivalent to P, etc.
wisStopPosition :: Lens' WorkItemStatus (Maybe Position)
wisStopPosition
  = lens _wisStopPosition
      (\ s a -> s{_wisStopPosition = a})

-- | See documentation of stop_position.
wisDynamicSourceSplit :: Lens' WorkItemStatus (Maybe DynamicSourceSplit)
wisDynamicSourceSplit
  = lens _wisDynamicSourceSplit
      (\ s a -> s{_wisDynamicSourceSplit = a})

-- | True if the WorkItem was completed (successfully or unsuccessfully).
wisCompleted :: Lens' WorkItemStatus (Maybe Bool)
wisCompleted
  = lens _wisCompleted (\ s a -> s{_wisCompleted = a})

-- | DEPRECATED in favor of dynamic_source_split.
wisSourceFork :: Lens' WorkItemStatus (Maybe SourceFork)
wisSourceFork
  = lens _wisSourceFork
      (\ s a -> s{_wisSourceFork = a})

-- | The report index. When a WorkItem is leased, the lease will contain an
-- initial report index. When a WorkItem\'s status is reported to the
-- system, the report should be sent with that report index, and the
-- response will contain the index the worker should use for the next
-- report. Reports received with unexpected index values will be rejected
-- by the service. In order to preserve idempotency, the worker should not
-- alter the contents of a report, even if the worker must submit the same
-- report multiple times before getting back a response. The worker should
-- not submit a subsequent report until the response for the previous
-- report had been received from the service.
wisReportIndex :: Lens' WorkItemStatus (Maybe Int64)
wisReportIndex
  = lens _wisReportIndex
      (\ s a -> s{_wisReportIndex = a})
      . mapping _Coerce

-- | Amount of time the worker requests for its lease.
wisRequestedLeaseDuration :: Lens' WorkItemStatus (Maybe Text)
wisRequestedLeaseDuration
  = lens _wisRequestedLeaseDuration
      (\ s a -> s{_wisRequestedLeaseDuration = a})

-- | Specifies errors which occurred during processing. If errors are
-- provided, and completed = true, then the WorkItem is considered to have
-- failed.
wisErrors :: Lens' WorkItemStatus [Status]
wisErrors
  = lens _wisErrors (\ s a -> s{_wisErrors = a}) .
      _Default
      . _Coerce

-- | Worker output counters for this WorkItem.
wisCounterUpdates :: Lens' WorkItemStatus [CounterUpdate]
wisCounterUpdates
  = lens _wisCounterUpdates
      (\ s a -> s{_wisCounterUpdates = a})
      . _Default
      . _Coerce

-- | DEPRECATED in favor of counter_updates.
wisMetricUpdates :: Lens' WorkItemStatus [MetricUpdate]
wisMetricUpdates
  = lens _wisMetricUpdates
      (\ s a -> s{_wisMetricUpdates = a})
      . _Default
      . _Coerce

-- | Identifies the WorkItem.
wisWorkItemId :: Lens' WorkItemStatus (Maybe Text)
wisWorkItemId
  = lens _wisWorkItemId
      (\ s a -> s{_wisWorkItemId = a})

instance FromJSON WorkItemStatus where
        parseJSON
          = withObject "WorkItemStatus"
              (\ o ->
                 WorkItemStatus' <$>
                   (o .:? "reportedProgress") <*> (o .:? "progress") <*>
                     (o .:? "sourceOperationResponse")
                     <*> (o .:? "stopPosition")
                     <*> (o .:? "dynamicSourceSplit")
                     <*> (o .:? "completed")
                     <*> (o .:? "sourceFork")
                     <*> (o .:? "reportIndex")
                     <*> (o .:? "requestedLeaseDuration")
                     <*> (o .:? "errors" .!= mempty)
                     <*> (o .:? "counterUpdates" .!= mempty)
                     <*> (o .:? "metricUpdates" .!= mempty)
                     <*> (o .:? "workItemId"))

instance ToJSON WorkItemStatus where
        toJSON WorkItemStatus'{..}
          = object
              (catMaybes
                 [("reportedProgress" .=) <$> _wisReportedProgress,
                  ("progress" .=) <$> _wisProgress,
                  ("sourceOperationResponse" .=) <$>
                    _wisSourceOperationResponse,
                  ("stopPosition" .=) <$> _wisStopPosition,
                  ("dynamicSourceSplit" .=) <$> _wisDynamicSourceSplit,
                  ("completed" .=) <$> _wisCompleted,
                  ("sourceFork" .=) <$> _wisSourceFork,
                  ("reportIndex" .=) <$> _wisReportIndex,
                  ("requestedLeaseDuration" .=) <$>
                    _wisRequestedLeaseDuration,
                  ("errors" .=) <$> _wisErrors,
                  ("counterUpdates" .=) <$> _wisCounterUpdates,
                  ("metricUpdates" .=) <$> _wisMetricUpdates,
                  ("workItemId" .=) <$> _wisWorkItemId])

-- | Labels are used to group WorkerMessages. For example, a worker_message
-- about a particular container might have the labels: { \"JOB_ID\":
-- \"2015-04-22\", \"WORKER_ID\": \"wordcount-vm-2015…\"
-- \"CONTAINER_TYPE\": \"worker\", \"CONTAINER_ID\": \"ac1234def\"} Label
-- tags typically correspond to Label enum values. However, for ease of
-- development other strings can be used as tags. LABEL_UNSPECIFIED should
-- not be used here.
--
-- /See:/ 'workerMessageLabels' smart constructor.
newtype WorkerMessageLabels = WorkerMessageLabels'
    { _wmlAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerMessageLabels' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wmlAddtional'
workerMessageLabels
    :: HashMap Text Text -- ^ 'wmlAddtional'
    -> WorkerMessageLabels
workerMessageLabels pWmlAddtional_ =
    WorkerMessageLabels'
    { _wmlAddtional = _Coerce # pWmlAddtional_
    }

wmlAddtional :: Lens' WorkerMessageLabels (HashMap Text Text)
wmlAddtional
  = lens _wmlAddtional (\ s a -> s{_wmlAddtional = a})
      . _Coerce

instance FromJSON WorkerMessageLabels where
        parseJSON
          = withObject "WorkerMessageLabels"
              (\ o -> WorkerMessageLabels' <$> (parseJSONObject o))

instance ToJSON WorkerMessageLabels where
        toJSON = toJSON . _wmlAddtional

-- | An instruction that copies its inputs (zero or more) to its (single)
-- output.
--
-- /See:/ 'flattenInstruction' smart constructor.
newtype FlattenInstruction = FlattenInstruction'
    { _fiInputs :: Maybe [InstructionInput]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'FlattenInstruction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fiInputs'
flattenInstruction
    :: FlattenInstruction
flattenInstruction =
    FlattenInstruction'
    { _fiInputs = Nothing
    }

-- | Describes the inputs to the flatten instruction.
fiInputs :: Lens' FlattenInstruction [InstructionInput]
fiInputs
  = lens _fiInputs (\ s a -> s{_fiInputs = a}) .
      _Default
      . _Coerce

instance FromJSON FlattenInstruction where
        parseJSON
          = withObject "FlattenInstruction"
              (\ o ->
                 FlattenInstruction' <$> (o .:? "inputs" .!= mempty))

instance ToJSON FlattenInstruction where
        toJSON FlattenInstruction'{..}
          = object (catMaybes [("inputs" .=) <$> _fiInputs])

-- | A message code is used to report status and error messages to the
-- service. The message codes are intended to be machine readable. The
-- service will take care of translating these into user understandable
-- messages if necessary. Example use cases: 1. Worker processes reporting
-- successful startup. 2. Worker processes reporting specific errors (e.g.
-- package staging failure).
--
-- /See:/ 'workerMessageCode' smart constructor.
data WorkerMessageCode = WorkerMessageCode'
    { _wmcParameters :: !(Maybe WorkerMessageCodeParameters)
    , _wmcCode       :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerMessageCode' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wmcParameters'
--
-- * 'wmcCode'
workerMessageCode
    :: WorkerMessageCode
workerMessageCode =
    WorkerMessageCode'
    { _wmcParameters = Nothing
    , _wmcCode = Nothing
    }

-- | Parameters contains specific information about the code. This is a
-- struct to allow parameters of different types. Examples: 1. For a
-- \"HARNESS_STARTED\" message parameters might provide the name of the
-- worker and additional data like timing information. 2. For a
-- \"GCS_DOWNLOAD_ERROR\" parameters might contain fields listing the GCS
-- objects being downloaded and fields containing errors. In general
-- complex data structures should be avoided. If a worker needs to send a
-- specific and complicated data structure then please consider defining a
-- new proto and adding it to the data oneof in WorkerMessageResponse.
-- Conventions: Parameters should only be used for information that isn\'t
-- typically passed as a label. hostname and other worker identifiers
-- should almost always be passed as labels since they will be included on
-- most messages.
wmcParameters :: Lens' WorkerMessageCode (Maybe WorkerMessageCodeParameters)
wmcParameters
  = lens _wmcParameters
      (\ s a -> s{_wmcParameters = a})

-- | The code is a string intended for consumption by a machine that
-- identifies the type of message being sent. Examples: 1.
-- \"HARNESS_STARTED\" might be used to indicate the worker harness has
-- started. 2. \"GCS_DOWNLOAD_ERROR\" might be used to indicate an error
-- downloading a GCS file as part of the boot process of one of the worker
-- containers. This is a string and not an enum to make it easy to add new
-- codes without waiting for an API change.
wmcCode :: Lens' WorkerMessageCode (Maybe Text)
wmcCode = lens _wmcCode (\ s a -> s{_wmcCode = a})

instance FromJSON WorkerMessageCode where
        parseJSON
          = withObject "WorkerMessageCode"
              (\ o ->
                 WorkerMessageCode' <$>
                   (o .:? "parameters") <*> (o .:? "code"))

instance ToJSON WorkerMessageCode where
        toJSON WorkerMessageCode'{..}
          = object
              (catMaybes
                 [("parameters" .=) <$> _wmcParameters,
                  ("code" .=) <$> _wmcCode])

-- | The map of transform name prefixes of the job to be replaced to the
-- corresponding name prefixes of the new job.
--
-- /See:/ 'jobTransformNameMApping' smart constructor.
newtype JobTransformNameMApping = JobTransformNameMApping'
    { _jtnmaAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobTransformNameMApping' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jtnmaAddtional'
jobTransformNameMApping
    :: HashMap Text Text -- ^ 'jtnmaAddtional'
    -> JobTransformNameMApping
jobTransformNameMApping pJtnmaAddtional_ =
    JobTransformNameMApping'
    { _jtnmaAddtional = _Coerce # pJtnmaAddtional_
    }

jtnmaAddtional :: Lens' JobTransformNameMApping (HashMap Text Text)
jtnmaAddtional
  = lens _jtnmaAddtional
      (\ s a -> s{_jtnmaAddtional = a})
      . _Coerce

instance FromJSON JobTransformNameMApping where
        parseJSON
          = withObject "JobTransformNameMApping"
              (\ o ->
                 JobTransformNameMApping' <$> (parseJSONObject o))

instance ToJSON JobTransformNameMApping where
        toJSON = toJSON . _jtnmaAddtional

-- | The source to read from, plus its parameters.
--
-- /See:/ 'sourceSpec' smart constructor.
newtype SourceSpec = SourceSpec'
    { _ssAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceSpec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssAddtional'
sourceSpec
    :: HashMap Text JSONValue -- ^ 'ssAddtional'
    -> SourceSpec
sourceSpec pSsAddtional_ =
    SourceSpec'
    { _ssAddtional = _Coerce # pSsAddtional_
    }

-- | Properties of the object.
ssAddtional :: Lens' SourceSpec (HashMap Text JSONValue)
ssAddtional
  = lens _ssAddtional (\ s a -> s{_ssAddtional = a}) .
      _Coerce

instance FromJSON SourceSpec where
        parseJSON
          = withObject "SourceSpec"
              (\ o -> SourceSpec' <$> (parseJSONObject o))

instance ToJSON SourceSpec where
        toJSON = toJSON . _ssAddtional

-- | Metadata about a Source useful for automatically optimizing and tuning
-- the pipeline, etc.
--
-- /See:/ 'sourceMetadata' smart constructor.
data SourceMetadata = SourceMetadata'
    { _smEstimatedSizeBytes :: !(Maybe (Textual Int64))
    , _smProducesSortedKeys :: !(Maybe Bool)
    , _smInfinite           :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'smEstimatedSizeBytes'
--
-- * 'smProducesSortedKeys'
--
-- * 'smInfinite'
sourceMetadata
    :: SourceMetadata
sourceMetadata =
    SourceMetadata'
    { _smEstimatedSizeBytes = Nothing
    , _smProducesSortedKeys = Nothing
    , _smInfinite = Nothing
    }

-- | An estimate of the total size (in bytes) of the data that would be read
-- from this source. This estimate is in terms of external storage size,
-- before any decompression or other processing done by the reader.
smEstimatedSizeBytes :: Lens' SourceMetadata (Maybe Int64)
smEstimatedSizeBytes
  = lens _smEstimatedSizeBytes
      (\ s a -> s{_smEstimatedSizeBytes = a})
      . mapping _Coerce

-- | Whether this source is known to produce key\/value pairs with the
-- (encoded) keys in lexicographically sorted order.
smProducesSortedKeys :: Lens' SourceMetadata (Maybe Bool)
smProducesSortedKeys
  = lens _smProducesSortedKeys
      (\ s a -> s{_smProducesSortedKeys = a})

-- | Specifies that the size of this source is known to be infinite (this is
-- a streaming source).
smInfinite :: Lens' SourceMetadata (Maybe Bool)
smInfinite
  = lens _smInfinite (\ s a -> s{_smInfinite = a})

instance FromJSON SourceMetadata where
        parseJSON
          = withObject "SourceMetadata"
              (\ o ->
                 SourceMetadata' <$>
                   (o .:? "estimatedSizeBytes") <*>
                     (o .:? "producesSortedKeys")
                     <*> (o .:? "infinite"))

instance ToJSON SourceMetadata where
        toJSON SourceMetadata'{..}
          = object
              (catMaybes
                 [("estimatedSizeBytes" .=) <$> _smEstimatedSizeBytes,
                  ("producesSortedKeys" .=) <$> _smProducesSortedKeys,
                  ("infinite" .=) <$> _smInfinite])

-- | Experimental settings.
--
-- /See:/ 'environmentInternalExperiments' smart constructor.
newtype EnvironmentInternalExperiments = EnvironmentInternalExperiments'
    { _eieAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'EnvironmentInternalExperiments' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'eieAddtional'
environmentInternalExperiments
    :: HashMap Text JSONValue -- ^ 'eieAddtional'
    -> EnvironmentInternalExperiments
environmentInternalExperiments pEieAddtional_ =
    EnvironmentInternalExperiments'
    { _eieAddtional = _Coerce # pEieAddtional_
    }

-- | Properties of the object. Contains field \'type with type URL.
eieAddtional :: Lens' EnvironmentInternalExperiments (HashMap Text JSONValue)
eieAddtional
  = lens _eieAddtional (\ s a -> s{_eieAddtional = a})
      . _Coerce

instance FromJSON EnvironmentInternalExperiments
         where
        parseJSON
          = withObject "EnvironmentInternalExperiments"
              (\ o ->
                 EnvironmentInternalExperiments' <$>
                   (parseJSONObject o))

instance ToJSON EnvironmentInternalExperiments where
        toJSON = toJSON . _eieAddtional

-- | Taskrunner configuration settings.
--
-- /See:/ 'taskRunnerSettings' smart constructor.
data TaskRunnerSettings = TaskRunnerSettings'
    { _trsContinueOnException      :: !(Maybe Bool)
    , _trsHarnessCommand           :: !(Maybe Text)
    , _trsWorkflowFileName         :: !(Maybe Text)
    , _trsTaskGroup                :: !(Maybe Text)
    , _trsAlsologtostderr          :: !(Maybe Bool)
    , _trsDataflowAPIVersion       :: !(Maybe Text)
    , _trsLogDir                   :: !(Maybe Text)
    , _trsCommandlinesFileName     :: !(Maybe Text)
    , _trsVMId                     :: !(Maybe Text)
    , _trsBaseURL                  :: !(Maybe Text)
    , _trsOAuthScopes              :: !(Maybe [Text])
    , _trsTaskUser                 :: !(Maybe Text)
    , _trsStreamingWorkerMainClass :: !(Maybe Text)
    , _trsBaseTaskDir              :: !(Maybe Text)
    , _trsLogUploadLocation        :: !(Maybe Text)
    , _trsTempStoragePrefix        :: !(Maybe Text)
    , _trsLogToSerialconsole       :: !(Maybe Bool)
    , _trsParallelWorkerSettings   :: !(Maybe WorkerSettings)
    , _trsLanguageHint             :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TaskRunnerSettings' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'trsContinueOnException'
--
-- * 'trsHarnessCommand'
--
-- * 'trsWorkflowFileName'
--
-- * 'trsTaskGroup'
--
-- * 'trsAlsologtostderr'
--
-- * 'trsDataflowAPIVersion'
--
-- * 'trsLogDir'
--
-- * 'trsCommandlinesFileName'
--
-- * 'trsVMId'
--
-- * 'trsBaseURL'
--
-- * 'trsOAuthScopes'
--
-- * 'trsTaskUser'
--
-- * 'trsStreamingWorkerMainClass'
--
-- * 'trsBaseTaskDir'
--
-- * 'trsLogUploadLocation'
--
-- * 'trsTempStoragePrefix'
--
-- * 'trsLogToSerialconsole'
--
-- * 'trsParallelWorkerSettings'
--
-- * 'trsLanguageHint'
taskRunnerSettings
    :: TaskRunnerSettings
taskRunnerSettings =
    TaskRunnerSettings'
    { _trsContinueOnException = Nothing
    , _trsHarnessCommand = Nothing
    , _trsWorkflowFileName = Nothing
    , _trsTaskGroup = Nothing
    , _trsAlsologtostderr = Nothing
    , _trsDataflowAPIVersion = Nothing
    , _trsLogDir = Nothing
    , _trsCommandlinesFileName = Nothing
    , _trsVMId = Nothing
    , _trsBaseURL = Nothing
    , _trsOAuthScopes = Nothing
    , _trsTaskUser = Nothing
    , _trsStreamingWorkerMainClass = Nothing
    , _trsBaseTaskDir = Nothing
    , _trsLogUploadLocation = Nothing
    , _trsTempStoragePrefix = Nothing
    , _trsLogToSerialconsole = Nothing
    , _trsParallelWorkerSettings = Nothing
    , _trsLanguageHint = Nothing
    }

-- | Whether to continue taskrunner if an exception is hit.
trsContinueOnException :: Lens' TaskRunnerSettings (Maybe Bool)
trsContinueOnException
  = lens _trsContinueOnException
      (\ s a -> s{_trsContinueOnException = a})

-- | The command to launch the worker harness.
trsHarnessCommand :: Lens' TaskRunnerSettings (Maybe Text)
trsHarnessCommand
  = lens _trsHarnessCommand
      (\ s a -> s{_trsHarnessCommand = a})

-- | The file to store the workflow in.
trsWorkflowFileName :: Lens' TaskRunnerSettings (Maybe Text)
trsWorkflowFileName
  = lens _trsWorkflowFileName
      (\ s a -> s{_trsWorkflowFileName = a})

-- | The UNIX group ID on the worker VM to use for tasks launched by
-- taskrunner; e.g. \"wheel\".
trsTaskGroup :: Lens' TaskRunnerSettings (Maybe Text)
trsTaskGroup
  = lens _trsTaskGroup (\ s a -> s{_trsTaskGroup = a})

-- | Whether to also send taskrunner log info to stderr.
trsAlsologtostderr :: Lens' TaskRunnerSettings (Maybe Bool)
trsAlsologtostderr
  = lens _trsAlsologtostderr
      (\ s a -> s{_trsAlsologtostderr = a})

-- | The API version of endpoint, e.g. \"v1b3\"
trsDataflowAPIVersion :: Lens' TaskRunnerSettings (Maybe Text)
trsDataflowAPIVersion
  = lens _trsDataflowAPIVersion
      (\ s a -> s{_trsDataflowAPIVersion = a})

-- | The directory on the VM to store logs.
trsLogDir :: Lens' TaskRunnerSettings (Maybe Text)
trsLogDir
  = lens _trsLogDir (\ s a -> s{_trsLogDir = a})

-- | The file to store preprocessing commands in.
trsCommandlinesFileName :: Lens' TaskRunnerSettings (Maybe Text)
trsCommandlinesFileName
  = lens _trsCommandlinesFileName
      (\ s a -> s{_trsCommandlinesFileName = a})

-- | The ID string of the VM.
trsVMId :: Lens' TaskRunnerSettings (Maybe Text)
trsVMId = lens _trsVMId (\ s a -> s{_trsVMId = a})

-- | The base URL for the taskrunner to use when accessing Google Cloud APIs.
-- When workers access Google Cloud APIs, they logically do so via relative
-- URLs. If this field is specified, it supplies the base URL to use for
-- resolving these relative URLs. The normative algorithm used is defined
-- by RFC 1808, \"Relative Uniform Resource Locators\". If not specified,
-- the default value is \"http:\/\/www.googleapis.com\/\"
trsBaseURL :: Lens' TaskRunnerSettings (Maybe Text)
trsBaseURL
  = lens _trsBaseURL (\ s a -> s{_trsBaseURL = a})

-- | The OAuth2 scopes to be requested by the taskrunner in order to access
-- the Cloud Dataflow API.
trsOAuthScopes :: Lens' TaskRunnerSettings [Text]
trsOAuthScopes
  = lens _trsOAuthScopes
      (\ s a -> s{_trsOAuthScopes = a})
      . _Default
      . _Coerce

-- | The UNIX user ID on the worker VM to use for tasks launched by
-- taskrunner; e.g. \"root\".
trsTaskUser :: Lens' TaskRunnerSettings (Maybe Text)
trsTaskUser
  = lens _trsTaskUser (\ s a -> s{_trsTaskUser = a})

-- | The streaming worker main class name.
trsStreamingWorkerMainClass :: Lens' TaskRunnerSettings (Maybe Text)
trsStreamingWorkerMainClass
  = lens _trsStreamingWorkerMainClass
      (\ s a -> s{_trsStreamingWorkerMainClass = a})

-- | The location on the worker for task-specific subdirectories.
trsBaseTaskDir :: Lens' TaskRunnerSettings (Maybe Text)
trsBaseTaskDir
  = lens _trsBaseTaskDir
      (\ s a -> s{_trsBaseTaskDir = a})

-- | Indicates where to put logs. If this is not specified, the logs will not
-- be uploaded. The supported resource type is: Google Cloud Storage:
-- storage.googleapis.com\/{bucket}\/{object}
-- bucket.storage.googleapis.com\/{object}
trsLogUploadLocation :: Lens' TaskRunnerSettings (Maybe Text)
trsLogUploadLocation
  = lens _trsLogUploadLocation
      (\ s a -> s{_trsLogUploadLocation = a})

-- | The prefix of the resources the taskrunner should use for temporary
-- storage. The supported resource type is: Google Cloud Storage:
-- storage.googleapis.com\/{bucket}\/{object}
-- bucket.storage.googleapis.com\/{object}
trsTempStoragePrefix :: Lens' TaskRunnerSettings (Maybe Text)
trsTempStoragePrefix
  = lens _trsTempStoragePrefix
      (\ s a -> s{_trsTempStoragePrefix = a})

-- | Whether to send taskrunner log info to Google Compute Engine VM serial
-- console.
trsLogToSerialconsole :: Lens' TaskRunnerSettings (Maybe Bool)
trsLogToSerialconsole
  = lens _trsLogToSerialconsole
      (\ s a -> s{_trsLogToSerialconsole = a})

-- | The settings to pass to the parallel worker harness.
trsParallelWorkerSettings :: Lens' TaskRunnerSettings (Maybe WorkerSettings)
trsParallelWorkerSettings
  = lens _trsParallelWorkerSettings
      (\ s a -> s{_trsParallelWorkerSettings = a})

-- | The suggested backend language.
trsLanguageHint :: Lens' TaskRunnerSettings (Maybe Text)
trsLanguageHint
  = lens _trsLanguageHint
      (\ s a -> s{_trsLanguageHint = a})

instance FromJSON TaskRunnerSettings where
        parseJSON
          = withObject "TaskRunnerSettings"
              (\ o ->
                 TaskRunnerSettings' <$>
                   (o .:? "continueOnException") <*>
                     (o .:? "harnessCommand")
                     <*> (o .:? "workflowFileName")
                     <*> (o .:? "taskGroup")
                     <*> (o .:? "alsologtostderr")
                     <*> (o .:? "dataflowApiVersion")
                     <*> (o .:? "logDir")
                     <*> (o .:? "commandlinesFileName")
                     <*> (o .:? "vmId")
                     <*> (o .:? "baseUrl")
                     <*> (o .:? "oauthScopes" .!= mempty)
                     <*> (o .:? "taskUser")
                     <*> (o .:? "streamingWorkerMainClass")
                     <*> (o .:? "baseTaskDir")
                     <*> (o .:? "logUploadLocation")
                     <*> (o .:? "tempStoragePrefix")
                     <*> (o .:? "logToSerialconsole")
                     <*> (o .:? "parallelWorkerSettings")
                     <*> (o .:? "languageHint"))

instance ToJSON TaskRunnerSettings where
        toJSON TaskRunnerSettings'{..}
          = object
              (catMaybes
                 [("continueOnException" .=) <$>
                    _trsContinueOnException,
                  ("harnessCommand" .=) <$> _trsHarnessCommand,
                  ("workflowFileName" .=) <$> _trsWorkflowFileName,
                  ("taskGroup" .=) <$> _trsTaskGroup,
                  ("alsologtostderr" .=) <$> _trsAlsologtostderr,
                  ("dataflowApiVersion" .=) <$> _trsDataflowAPIVersion,
                  ("logDir" .=) <$> _trsLogDir,
                  ("commandlinesFileName" .=) <$>
                    _trsCommandlinesFileName,
                  ("vmId" .=) <$> _trsVMId,
                  ("baseUrl" .=) <$> _trsBaseURL,
                  ("oauthScopes" .=) <$> _trsOAuthScopes,
                  ("taskUser" .=) <$> _trsTaskUser,
                  ("streamingWorkerMainClass" .=) <$>
                    _trsStreamingWorkerMainClass,
                  ("baseTaskDir" .=) <$> _trsBaseTaskDir,
                  ("logUploadLocation" .=) <$> _trsLogUploadLocation,
                  ("tempStoragePrefix" .=) <$> _trsTempStoragePrefix,
                  ("logToSerialconsole" .=) <$> _trsLogToSerialconsole,
                  ("parallelWorkerSettings" .=) <$>
                    _trsParallelWorkerSettings,
                  ("languageHint" .=) <$> _trsLanguageHint])

-- | Configuration information for a single streaming computation.
--
-- /See:/ 'streamingComputationConfig' smart constructor.
data StreamingComputationConfig = StreamingComputationConfig'
    { _sccInstructions  :: !(Maybe [ParallelInstruction])
    , _sccSystemName    :: !(Maybe Text)
    , _sccComputationId :: !(Maybe Text)
    , _sccStageName     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingComputationConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sccInstructions'
--
-- * 'sccSystemName'
--
-- * 'sccComputationId'
--
-- * 'sccStageName'
streamingComputationConfig
    :: StreamingComputationConfig
streamingComputationConfig =
    StreamingComputationConfig'
    { _sccInstructions = Nothing
    , _sccSystemName = Nothing
    , _sccComputationId = Nothing
    , _sccStageName = Nothing
    }

-- | Instructions that comprise the computation.
sccInstructions :: Lens' StreamingComputationConfig [ParallelInstruction]
sccInstructions
  = lens _sccInstructions
      (\ s a -> s{_sccInstructions = a})
      . _Default
      . _Coerce

-- | System defined name for this computation.
sccSystemName :: Lens' StreamingComputationConfig (Maybe Text)
sccSystemName
  = lens _sccSystemName
      (\ s a -> s{_sccSystemName = a})

-- | Unique identifier for this computation.
sccComputationId :: Lens' StreamingComputationConfig (Maybe Text)
sccComputationId
  = lens _sccComputationId
      (\ s a -> s{_sccComputationId = a})

-- | Stage name of this computation.
sccStageName :: Lens' StreamingComputationConfig (Maybe Text)
sccStageName
  = lens _sccStageName (\ s a -> s{_sccStageName = a})

instance FromJSON StreamingComputationConfig where
        parseJSON
          = withObject "StreamingComputationConfig"
              (\ o ->
                 StreamingComputationConfig' <$>
                   (o .:? "instructions" .!= mempty) <*>
                     (o .:? "systemName")
                     <*> (o .:? "computationId")
                     <*> (o .:? "stageName"))

instance ToJSON StreamingComputationConfig where
        toJSON StreamingComputationConfig'{..}
          = object
              (catMaybes
                 [("instructions" .=) <$> _sccInstructions,
                  ("systemName" .=) <$> _sccSystemName,
                  ("computationId" .=) <$> _sccComputationId,
                  ("stageName" .=) <$> _sccStageName])

-- | The Cloud Dataflow SDK pipeline options specified by the user. These
-- options are passed through the service and are used to recreate the SDK
-- pipeline options on the worker in a language agnostic and platform
-- independent way.
--
-- /See:/ 'environmentSdkPipelineOptions' smart constructor.
newtype EnvironmentSdkPipelineOptions = EnvironmentSdkPipelineOptions'
    { _espoAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'EnvironmentSdkPipelineOptions' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'espoAddtional'
environmentSdkPipelineOptions
    :: HashMap Text JSONValue -- ^ 'espoAddtional'
    -> EnvironmentSdkPipelineOptions
environmentSdkPipelineOptions pEspoAddtional_ =
    EnvironmentSdkPipelineOptions'
    { _espoAddtional = _Coerce # pEspoAddtional_
    }

-- | Properties of the object.
espoAddtional :: Lens' EnvironmentSdkPipelineOptions (HashMap Text JSONValue)
espoAddtional
  = lens _espoAddtional
      (\ s a -> s{_espoAddtional = a})
      . _Coerce

instance FromJSON EnvironmentSdkPipelineOptions where
        parseJSON
          = withObject "EnvironmentSdkPipelineOptions"
              (\ o ->
                 EnvironmentSdkPipelineOptions' <$>
                   (parseJSONObject o))

instance ToJSON EnvironmentSdkPipelineOptions where
        toJSON = toJSON . _espoAddtional

-- | A representation of a floating point mean metric contribution.
--
-- /See:/ 'floatingPointMean' smart constructor.
data FloatingPointMean = FloatingPointMean'
    { _fpmCount :: !(Maybe SplitInt64)
    , _fpmSum   :: !(Maybe (Textual Double))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'FloatingPointMean' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fpmCount'
--
-- * 'fpmSum'
floatingPointMean
    :: FloatingPointMean
floatingPointMean =
    FloatingPointMean'
    { _fpmCount = Nothing
    , _fpmSum = Nothing
    }

-- | The number of values being aggregated.
fpmCount :: Lens' FloatingPointMean (Maybe SplitInt64)
fpmCount = lens _fpmCount (\ s a -> s{_fpmCount = a})

-- | The sum of all values being aggregated.
fpmSum :: Lens' FloatingPointMean (Maybe Double)
fpmSum
  = lens _fpmSum (\ s a -> s{_fpmSum = a}) .
      mapping _Coerce

instance FromJSON FloatingPointMean where
        parseJSON
          = withObject "FloatingPointMean"
              (\ o ->
                 FloatingPointMean' <$>
                   (o .:? "count") <*> (o .:? "sum"))

instance ToJSON FloatingPointMean where
        toJSON FloatingPointMean'{..}
          = object
              (catMaybes
                 [("count" .=) <$> _fpmCount, ("sum" .=) <$> _fpmSum])

-- | Request to lease WorkItems.
--
-- /See:/ 'leaseWorkItemRequest' smart constructor.
data LeaseWorkItemRequest = LeaseWorkItemRequest'
    { _lwirWorkItemTypes          :: !(Maybe [Text])
    , _lwirCurrentWorkerTime      :: !(Maybe Text)
    , _lwirLocation               :: !(Maybe Text)
    , _lwirWorkerCapabilities     :: !(Maybe [Text])
    , _lwirRequestedLeaseDuration :: !(Maybe Text)
    , _lwirWorkerId               :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'LeaseWorkItemRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lwirWorkItemTypes'
--
-- * 'lwirCurrentWorkerTime'
--
-- * 'lwirLocation'
--
-- * 'lwirWorkerCapabilities'
--
-- * 'lwirRequestedLeaseDuration'
--
-- * 'lwirWorkerId'
leaseWorkItemRequest
    :: LeaseWorkItemRequest
leaseWorkItemRequest =
    LeaseWorkItemRequest'
    { _lwirWorkItemTypes = Nothing
    , _lwirCurrentWorkerTime = Nothing
    , _lwirLocation = Nothing
    , _lwirWorkerCapabilities = Nothing
    , _lwirRequestedLeaseDuration = Nothing
    , _lwirWorkerId = Nothing
    }

-- | Filter for WorkItem type.
lwirWorkItemTypes :: Lens' LeaseWorkItemRequest [Text]
lwirWorkItemTypes
  = lens _lwirWorkItemTypes
      (\ s a -> s{_lwirWorkItemTypes = a})
      . _Default
      . _Coerce

-- | The current timestamp at the worker.
lwirCurrentWorkerTime :: Lens' LeaseWorkItemRequest (Maybe Text)
lwirCurrentWorkerTime
  = lens _lwirCurrentWorkerTime
      (\ s a -> s{_lwirCurrentWorkerTime = a})

-- | The location which contains the WorkItem\'s job.
lwirLocation :: Lens' LeaseWorkItemRequest (Maybe Text)
lwirLocation
  = lens _lwirLocation (\ s a -> s{_lwirLocation = a})

-- | Worker capabilities. WorkItems might be limited to workers with specific
-- capabilities.
lwirWorkerCapabilities :: Lens' LeaseWorkItemRequest [Text]
lwirWorkerCapabilities
  = lens _lwirWorkerCapabilities
      (\ s a -> s{_lwirWorkerCapabilities = a})
      . _Default
      . _Coerce

-- | The initial lease period.
lwirRequestedLeaseDuration :: Lens' LeaseWorkItemRequest (Maybe Text)
lwirRequestedLeaseDuration
  = lens _lwirRequestedLeaseDuration
      (\ s a -> s{_lwirRequestedLeaseDuration = a})

-- | Identifies the worker leasing work -- typically the ID of the virtual
-- machine running the worker.
lwirWorkerId :: Lens' LeaseWorkItemRequest (Maybe Text)
lwirWorkerId
  = lens _lwirWorkerId (\ s a -> s{_lwirWorkerId = a})

instance FromJSON LeaseWorkItemRequest where
        parseJSON
          = withObject "LeaseWorkItemRequest"
              (\ o ->
                 LeaseWorkItemRequest' <$>
                   (o .:? "workItemTypes" .!= mempty) <*>
                     (o .:? "currentWorkerTime")
                     <*> (o .:? "location")
                     <*> (o .:? "workerCapabilities" .!= mempty)
                     <*> (o .:? "requestedLeaseDuration")
                     <*> (o .:? "workerId"))

instance ToJSON LeaseWorkItemRequest where
        toJSON LeaseWorkItemRequest'{..}
          = object
              (catMaybes
                 [("workItemTypes" .=) <$> _lwirWorkItemTypes,
                  ("currentWorkerTime" .=) <$> _lwirCurrentWorkerTime,
                  ("location" .=) <$> _lwirLocation,
                  ("workerCapabilities" .=) <$>
                    _lwirWorkerCapabilities,
                  ("requestedLeaseDuration" .=) <$>
                    _lwirRequestedLeaseDuration,
                  ("workerId" .=) <$> _lwirWorkerId])

-- | The result of a SourceOperationRequest, specified in
-- ReportWorkItemStatusRequest.source_operation when the work item is
-- completed.
--
-- /See:/ 'sourceOperationResponse' smart constructor.
data SourceOperationResponse = SourceOperationResponse'
    { _sorSplit       :: !(Maybe SourceSplitResponse)
    , _sorGetMetadata :: !(Maybe SourceGetMetadataResponse)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceOperationResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sorSplit'
--
-- * 'sorGetMetadata'
sourceOperationResponse
    :: SourceOperationResponse
sourceOperationResponse =
    SourceOperationResponse'
    { _sorSplit = Nothing
    , _sorGetMetadata = Nothing
    }

-- | A response to a request to split a source.
sorSplit :: Lens' SourceOperationResponse (Maybe SourceSplitResponse)
sorSplit = lens _sorSplit (\ s a -> s{_sorSplit = a})

-- | A response to a request to get metadata about a source.
sorGetMetadata :: Lens' SourceOperationResponse (Maybe SourceGetMetadataResponse)
sorGetMetadata
  = lens _sorGetMetadata
      (\ s a -> s{_sorGetMetadata = a})

instance FromJSON SourceOperationResponse where
        parseJSON
          = withObject "SourceOperationResponse"
              (\ o ->
                 SourceOperationResponse' <$>
                   (o .:? "split") <*> (o .:? "getMetadata"))

instance ToJSON SourceOperationResponse where
        toJSON SourceOperationResponse'{..}
          = object
              (catMaybes
                 [("split" .=) <$> _sorSplit,
                  ("getMetadata" .=) <$> _sorGetMetadata])

-- | Maps user stage names to stable computation names.
--
-- /See:/ 'topologyConfigUserStageToComputationNameMap' smart constructor.
newtype TopologyConfigUserStageToComputationNameMap = TopologyConfigUserStageToComputationNameMap'
    { _tcustcnmAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TopologyConfigUserStageToComputationNameMap' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tcustcnmAddtional'
topologyConfigUserStageToComputationNameMap
    :: HashMap Text Text -- ^ 'tcustcnmAddtional'
    -> TopologyConfigUserStageToComputationNameMap
topologyConfigUserStageToComputationNameMap pTcustcnmAddtional_ =
    TopologyConfigUserStageToComputationNameMap'
    { _tcustcnmAddtional = _Coerce # pTcustcnmAddtional_
    }

tcustcnmAddtional :: Lens' TopologyConfigUserStageToComputationNameMap (HashMap Text Text)
tcustcnmAddtional
  = lens _tcustcnmAddtional
      (\ s a -> s{_tcustcnmAddtional = a})
      . _Coerce

instance FromJSON
         TopologyConfigUserStageToComputationNameMap where
        parseJSON
          = withObject
              "TopologyConfigUserStageToComputationNameMap"
              (\ o ->
                 TopologyConfigUserStageToComputationNameMap' <$>
                   (parseJSONObject o))

instance ToJSON
         TopologyConfigUserStageToComputationNameMap where
        toJSON = toJSON . _tcustcnmAddtional

-- | A task which consists of a shell command for the worker to execute.
--
-- /See:/ 'shellTask' smart constructor.
data ShellTask = ShellTask'
    { _stCommand  :: !(Maybe Text)
    , _stExitCode :: !(Maybe (Textual Int32))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ShellTask' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'stCommand'
--
-- * 'stExitCode'
shellTask
    :: ShellTask
shellTask =
    ShellTask'
    { _stCommand = Nothing
    , _stExitCode = Nothing
    }

-- | The shell command to run.
stCommand :: Lens' ShellTask (Maybe Text)
stCommand
  = lens _stCommand (\ s a -> s{_stCommand = a})

-- | Exit code for the task.
stExitCode :: Lens' ShellTask (Maybe Int32)
stExitCode
  = lens _stExitCode (\ s a -> s{_stExitCode = a}) .
      mapping _Coerce

instance FromJSON ShellTask where
        parseJSON
          = withObject "ShellTask"
              (\ o ->
                 ShellTask' <$>
                   (o .:? "command") <*> (o .:? "exitCode"))

instance ToJSON ShellTask where
        toJSON ShellTask'{..}
          = object
              (catMaybes
                 [("command" .=) <$> _stCommand,
                  ("exitCode" .=) <$> _stExitCode])

--
-- /See:/ 'statusDetailsItem' smart constructor.
newtype StatusDetailsItem = StatusDetailsItem'
    { _sdiAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StatusDetailsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sdiAddtional'
statusDetailsItem
    :: HashMap Text JSONValue -- ^ 'sdiAddtional'
    -> StatusDetailsItem
statusDetailsItem pSdiAddtional_ =
    StatusDetailsItem'
    { _sdiAddtional = _Coerce # pSdiAddtional_
    }

-- | Properties of the object. Contains field \'type with type URL.
sdiAddtional :: Lens' StatusDetailsItem (HashMap Text JSONValue)
sdiAddtional
  = lens _sdiAddtional (\ s a -> s{_sdiAddtional = a})
      . _Coerce

instance FromJSON StatusDetailsItem where
        parseJSON
          = withObject "StatusDetailsItem"
              (\ o -> StatusDetailsItem' <$> (parseJSONObject o))

instance ToJSON StatusDetailsItem where
        toJSON = toJSON . _sdiAddtional

-- | Represents the level of parallelism in a WorkItem\'s input, reported by
-- the worker.
--
-- /See:/ 'reportedParallelism' smart constructor.
data ReportedParallelism = ReportedParallelism'
    { _rpValue      :: !(Maybe (Textual Double))
    , _rpIsInfinite :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ReportedParallelism' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rpValue'
--
-- * 'rpIsInfinite'
reportedParallelism
    :: ReportedParallelism
reportedParallelism =
    ReportedParallelism'
    { _rpValue = Nothing
    , _rpIsInfinite = Nothing
    }

-- | Specifies the level of parallelism in case it is finite.
rpValue :: Lens' ReportedParallelism (Maybe Double)
rpValue
  = lens _rpValue (\ s a -> s{_rpValue = a}) .
      mapping _Coerce

-- | Specifies whether the parallelism is infinite. If true, \"value\" is
-- ignored. Infinite parallelism means the service will assume that the
-- work item can always be split into more non-empty work items by dynamic
-- splitting. This is a work-around for lack of support for infinity by the
-- current JSON-based Java RPC stack.
rpIsInfinite :: Lens' ReportedParallelism (Maybe Bool)
rpIsInfinite
  = lens _rpIsInfinite (\ s a -> s{_rpIsInfinite = a})

instance FromJSON ReportedParallelism where
        parseJSON
          = withObject "ReportedParallelism"
              (\ o ->
                 ReportedParallelism' <$>
                   (o .:? "value") <*> (o .:? "isInfinite"))

instance ToJSON ReportedParallelism where
        toJSON ReportedParallelism'{..}
          = object
              (catMaybes
                 [("value" .=) <$> _rpValue,
                  ("isInfinite" .=) <$> _rpIsInfinite])

-- | Named properties associated with the step. Each kind of predefined step
-- has its own required set of properties.
--
-- /See:/ 'stepProperties' smart constructor.
newtype StepProperties = StepProperties'
    { _spAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StepProperties' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'spAddtional'
stepProperties
    :: HashMap Text JSONValue -- ^ 'spAddtional'
    -> StepProperties
stepProperties pSpAddtional_ =
    StepProperties'
    { _spAddtional = _Coerce # pSpAddtional_
    }

-- | Properties of the object.
spAddtional :: Lens' StepProperties (HashMap Text JSONValue)
spAddtional
  = lens _spAddtional (\ s a -> s{_spAddtional = a}) .
      _Coerce

instance FromJSON StepProperties where
        parseJSON
          = withObject "StepProperties"
              (\ o -> StepProperties' <$> (parseJSONObject o))

instance ToJSON StepProperties where
        toJSON = toJSON . _spAddtional

-- | Global topology of the streaming Dataflow job, including all
-- computations and their sharded locations.
--
-- /See:/ 'topologyConfig' smart constructor.
data TopologyConfig = TopologyConfig'
    { _tcDataDiskAssignments           :: !(Maybe [DataDiskAssignment])
    , _tcPersistentStateVersion        :: !(Maybe (Textual Int32))
    , _tcForwardingKeyBits             :: !(Maybe (Textual Int32))
    , _tcUserStageToComputationNameMap :: !(Maybe TopologyConfigUserStageToComputationNameMap)
    , _tcComputations                  :: !(Maybe [ComputationTopology])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'TopologyConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'tcDataDiskAssignments'
--
-- * 'tcPersistentStateVersion'
--
-- * 'tcForwardingKeyBits'
--
-- * 'tcUserStageToComputationNameMap'
--
-- * 'tcComputations'
topologyConfig
    :: TopologyConfig
topologyConfig =
    TopologyConfig'
    { _tcDataDiskAssignments = Nothing
    , _tcPersistentStateVersion = Nothing
    , _tcForwardingKeyBits = Nothing
    , _tcUserStageToComputationNameMap = Nothing
    , _tcComputations = Nothing
    }

-- | The disks assigned to a streaming Dataflow job.
tcDataDiskAssignments :: Lens' TopologyConfig [DataDiskAssignment]
tcDataDiskAssignments
  = lens _tcDataDiskAssignments
      (\ s a -> s{_tcDataDiskAssignments = a})
      . _Default
      . _Coerce

-- | Version number for persistent state.
tcPersistentStateVersion :: Lens' TopologyConfig (Maybe Int32)
tcPersistentStateVersion
  = lens _tcPersistentStateVersion
      (\ s a -> s{_tcPersistentStateVersion = a})
      . mapping _Coerce

-- | The size (in bits) of keys that will be assigned to source messages.
tcForwardingKeyBits :: Lens' TopologyConfig (Maybe Int32)
tcForwardingKeyBits
  = lens _tcForwardingKeyBits
      (\ s a -> s{_tcForwardingKeyBits = a})
      . mapping _Coerce

-- | Maps user stage names to stable computation names.
tcUserStageToComputationNameMap :: Lens' TopologyConfig (Maybe TopologyConfigUserStageToComputationNameMap)
tcUserStageToComputationNameMap
  = lens _tcUserStageToComputationNameMap
      (\ s a -> s{_tcUserStageToComputationNameMap = a})

-- | The computations associated with a streaming Dataflow job.
tcComputations :: Lens' TopologyConfig [ComputationTopology]
tcComputations
  = lens _tcComputations
      (\ s a -> s{_tcComputations = a})
      . _Default
      . _Coerce

instance FromJSON TopologyConfig where
        parseJSON
          = withObject "TopologyConfig"
              (\ o ->
                 TopologyConfig' <$>
                   (o .:? "dataDiskAssignments" .!= mempty) <*>
                     (o .:? "persistentStateVersion")
                     <*> (o .:? "forwardingKeyBits")
                     <*> (o .:? "userStageToComputationNameMap")
                     <*> (o .:? "computations" .!= mempty))

instance ToJSON TopologyConfig where
        toJSON TopologyConfig'{..}
          = object
              (catMaybes
                 [("dataDiskAssignments" .=) <$>
                    _tcDataDiskAssignments,
                  ("persistentStateVersion" .=) <$>
                    _tcPersistentStateVersion,
                  ("forwardingKeyBits" .=) <$> _tcForwardingKeyBits,
                  ("userStageToComputationNameMap" .=) <$>
                    _tcUserStageToComputationNameMap,
                  ("computations" .=) <$> _tcComputations])

-- | A suggestion by the service to the worker to dynamically split the
-- WorkItem.
--
-- /See:/ 'approximateSplitRequest' smart constructor.
data ApproximateSplitRequest = ApproximateSplitRequest'
    { _asrFractionConsumed :: !(Maybe (Textual Double))
    , _asrPosition         :: !(Maybe Position)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ApproximateSplitRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'asrFractionConsumed'
--
-- * 'asrPosition'
approximateSplitRequest
    :: ApproximateSplitRequest
approximateSplitRequest =
    ApproximateSplitRequest'
    { _asrFractionConsumed = Nothing
    , _asrPosition = Nothing
    }

-- | A fraction at which to split the work item, from 0.0 (beginning of the
-- input) to 1.0 (end of the input).
asrFractionConsumed :: Lens' ApproximateSplitRequest (Maybe Double)
asrFractionConsumed
  = lens _asrFractionConsumed
      (\ s a -> s{_asrFractionConsumed = a})
      . mapping _Coerce

-- | A Position at which to split the work item.
asrPosition :: Lens' ApproximateSplitRequest (Maybe Position)
asrPosition
  = lens _asrPosition (\ s a -> s{_asrPosition = a})

instance FromJSON ApproximateSplitRequest where
        parseJSON
          = withObject "ApproximateSplitRequest"
              (\ o ->
                 ApproximateSplitRequest' <$>
                   (o .:? "fractionConsumed") <*> (o .:? "position"))

instance ToJSON ApproximateSplitRequest where
        toJSON ApproximateSplitRequest'{..}
          = object
              (catMaybes
                 [("fractionConsumed" .=) <$> _asrFractionConsumed,
                  ("position" .=) <$> _asrPosition])

-- | A representation of an int64, n, that is immune to precision loss when
-- encoded in JSON.
--
-- /See:/ 'splitInt64' smart constructor.
data SplitInt64 = SplitInt64'
    { _siHighBits :: !(Maybe (Textual Int32))
    , _siLowBits  :: !(Maybe (Textual Word32))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SplitInt64' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'siHighBits'
--
-- * 'siLowBits'
splitInt64
    :: SplitInt64
splitInt64 =
    SplitInt64'
    { _siHighBits = Nothing
    , _siLowBits = Nothing
    }

-- | The high order bits, including the sign: n >> 32.
siHighBits :: Lens' SplitInt64 (Maybe Int32)
siHighBits
  = lens _siHighBits (\ s a -> s{_siHighBits = a}) .
      mapping _Coerce

-- | The low order bits: n & 0xffffffff.
siLowBits :: Lens' SplitInt64 (Maybe Word32)
siLowBits
  = lens _siLowBits (\ s a -> s{_siLowBits = a}) .
      mapping _Coerce

instance FromJSON SplitInt64 where
        parseJSON
          = withObject "SplitInt64"
              (\ o ->
                 SplitInt64' <$>
                   (o .:? "highBits") <*> (o .:? "lowBits"))

instance ToJSON SplitInt64 where
        toJSON SplitInt64'{..}
          = object
              (catMaybes
                 [("highBits" .=) <$> _siHighBits,
                  ("lowBits" .=) <$> _siLowBits])

-- | Provides data to pass through to the worker harness.
--
-- /See:/ 'workerSettings' smart constructor.
data WorkerSettings = WorkerSettings'
    { _wsServicePath        :: !(Maybe Text)
    , _wsBaseURL            :: !(Maybe Text)
    , _wsShuffleServicePath :: !(Maybe Text)
    , _wsTempStoragePrefix  :: !(Maybe Text)
    , _wsReportingEnabled   :: !(Maybe Bool)
    , _wsWorkerId           :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerSettings' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wsServicePath'
--
-- * 'wsBaseURL'
--
-- * 'wsShuffleServicePath'
--
-- * 'wsTempStoragePrefix'
--
-- * 'wsReportingEnabled'
--
-- * 'wsWorkerId'
workerSettings
    :: WorkerSettings
workerSettings =
    WorkerSettings'
    { _wsServicePath = Nothing
    , _wsBaseURL = Nothing
    , _wsShuffleServicePath = Nothing
    , _wsTempStoragePrefix = Nothing
    , _wsReportingEnabled = Nothing
    , _wsWorkerId = Nothing
    }

-- | The Cloud Dataflow service path relative to the root URL, for example,
-- \"dataflow\/v1b3\/projects\".
wsServicePath :: Lens' WorkerSettings (Maybe Text)
wsServicePath
  = lens _wsServicePath
      (\ s a -> s{_wsServicePath = a})

-- | The base URL for accessing Google Cloud APIs. When workers access Google
-- Cloud APIs, they logically do so via relative URLs. If this field is
-- specified, it supplies the base URL to use for resolving these relative
-- URLs. The normative algorithm used is defined by RFC 1808, \"Relative
-- Uniform Resource Locators\". If not specified, the default value is
-- \"http:\/\/www.googleapis.com\/\"
wsBaseURL :: Lens' WorkerSettings (Maybe Text)
wsBaseURL
  = lens _wsBaseURL (\ s a -> s{_wsBaseURL = a})

-- | The Shuffle service path relative to the root URL, for example,
-- \"shuffle\/v1beta1\".
wsShuffleServicePath :: Lens' WorkerSettings (Maybe Text)
wsShuffleServicePath
  = lens _wsShuffleServicePath
      (\ s a -> s{_wsShuffleServicePath = a})

-- | The prefix of the resources the system should use for temporary storage.
-- The supported resource type is: Google Cloud Storage:
-- storage.googleapis.com\/{bucket}\/{object}
-- bucket.storage.googleapis.com\/{object}
wsTempStoragePrefix :: Lens' WorkerSettings (Maybe Text)
wsTempStoragePrefix
  = lens _wsTempStoragePrefix
      (\ s a -> s{_wsTempStoragePrefix = a})

-- | Whether to send work progress updates to the service.
wsReportingEnabled :: Lens' WorkerSettings (Maybe Bool)
wsReportingEnabled
  = lens _wsReportingEnabled
      (\ s a -> s{_wsReportingEnabled = a})

-- | The ID of the worker running this pipeline.
wsWorkerId :: Lens' WorkerSettings (Maybe Text)
wsWorkerId
  = lens _wsWorkerId (\ s a -> s{_wsWorkerId = a})

instance FromJSON WorkerSettings where
        parseJSON
          = withObject "WorkerSettings"
              (\ o ->
                 WorkerSettings' <$>
                   (o .:? "servicePath") <*> (o .:? "baseUrl") <*>
                     (o .:? "shuffleServicePath")
                     <*> (o .:? "tempStoragePrefix")
                     <*> (o .:? "reportingEnabled")
                     <*> (o .:? "workerId"))

instance ToJSON WorkerSettings where
        toJSON WorkerSettings'{..}
          = object
              (catMaybes
                 [("servicePath" .=) <$> _wsServicePath,
                  ("baseUrl" .=) <$> _wsBaseURL,
                  ("shuffleServicePath" .=) <$> _wsShuffleServicePath,
                  ("tempStoragePrefix" .=) <$> _wsTempStoragePrefix,
                  ("reportingEnabled" .=) <$> _wsReportingEnabled,
                  ("workerId" .=) <$> _wsWorkerId])

-- | Response to a get debug configuration request.
--
-- /See:/ 'getDebugConfigResponse' smart constructor.
newtype GetDebugConfigResponse = GetDebugConfigResponse'
    { _gdcrConfig :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetDebugConfigResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gdcrConfig'
getDebugConfigResponse
    :: GetDebugConfigResponse
getDebugConfigResponse =
    GetDebugConfigResponse'
    { _gdcrConfig = Nothing
    }

-- | The encoded debug configuration for the requested component.
gdcrConfig :: Lens' GetDebugConfigResponse (Maybe Text)
gdcrConfig
  = lens _gdcrConfig (\ s a -> s{_gdcrConfig = a})

instance FromJSON GetDebugConfigResponse where
        parseJSON
          = withObject "GetDebugConfigResponse"
              (\ o -> GetDebugConfigResponse' <$> (o .:? "config"))

instance ToJSON GetDebugConfigResponse where
        toJSON GetDebugConfigResponse'{..}
          = object (catMaybes [("config" .=) <$> _gdcrConfig])

-- | Other data returned by the service, specific to the particular worker
-- harness.
--
-- /See:/ 'workItemServiceStateHarnessData' smart constructor.
newtype WorkItemServiceStateHarnessData = WorkItemServiceStateHarnessData'
    { _wisshdAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkItemServiceStateHarnessData' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wisshdAddtional'
workItemServiceStateHarnessData
    :: HashMap Text JSONValue -- ^ 'wisshdAddtional'
    -> WorkItemServiceStateHarnessData
workItemServiceStateHarnessData pWisshdAddtional_ =
    WorkItemServiceStateHarnessData'
    { _wisshdAddtional = _Coerce # pWisshdAddtional_
    }

-- | Properties of the object.
wisshdAddtional :: Lens' WorkItemServiceStateHarnessData (HashMap Text JSONValue)
wisshdAddtional
  = lens _wisshdAddtional
      (\ s a -> s{_wisshdAddtional = a})
      . _Coerce

instance FromJSON WorkItemServiceStateHarnessData
         where
        parseJSON
          = withObject "WorkItemServiceStateHarnessData"
              (\ o ->
                 WorkItemServiceStateHarnessData' <$>
                   (parseJSONObject o))

instance ToJSON WorkItemServiceStateHarnessData where
        toJSON = toJSON . _wisshdAddtional

-- | Data disk assignment for a given VM instance.
--
-- /See:/ 'dataDiskAssignment' smart constructor.
data DataDiskAssignment = DataDiskAssignment'
    { _ddaVMInstance :: !(Maybe Text)
    , _ddaDataDisks  :: !(Maybe [Text])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DataDiskAssignment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ddaVMInstance'
--
-- * 'ddaDataDisks'
dataDiskAssignment
    :: DataDiskAssignment
dataDiskAssignment =
    DataDiskAssignment'
    { _ddaVMInstance = Nothing
    , _ddaDataDisks = Nothing
    }

-- | VM instance name the data disks mounted to, for example
-- \"myproject-1014-104817-4c2-harness-0\".
ddaVMInstance :: Lens' DataDiskAssignment (Maybe Text)
ddaVMInstance
  = lens _ddaVMInstance
      (\ s a -> s{_ddaVMInstance = a})

-- | Mounted data disks. The order is important a data disk\'s 0-based index
-- in this list defines which persistent directory the disk is mounted to,
-- for example the list of { \"myproject-1014-104817-4c2-harness-0-disk-0\"
-- }, { \"myproject-1014-104817-4c2-harness-0-disk-1\" }.
ddaDataDisks :: Lens' DataDiskAssignment [Text]
ddaDataDisks
  = lens _ddaDataDisks (\ s a -> s{_ddaDataDisks = a})
      . _Default
      . _Coerce

instance FromJSON DataDiskAssignment where
        parseJSON
          = withObject "DataDiskAssignment"
              (\ o ->
                 DataDiskAssignment' <$>
                   (o .:? "vmInstance") <*>
                     (o .:? "dataDisks" .!= mempty))

instance ToJSON DataDiskAssignment where
        toJSON DataDiskAssignment'{..}
          = object
              (catMaybes
                 [("vmInstance" .=) <$> _ddaVMInstance,
                  ("dataDisks" .=) <$> _ddaDataDisks])

-- | Worker metrics exported from workers. This contains resource utilization
-- metrics accumulated from a variety of sources. For more information, see
-- go\/df-resource-signals. Note that this proto closely follows the
-- structure of its DFE siblings in its contents.
--
-- /See:/ 'resourceUtilizationReport' smart constructor.
newtype ResourceUtilizationReport = ResourceUtilizationReport'
    { _rurMetrics :: Maybe [ResourceUtilizationReportMetricsItem]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ResourceUtilizationReport' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rurMetrics'
resourceUtilizationReport
    :: ResourceUtilizationReport
resourceUtilizationReport =
    ResourceUtilizationReport'
    { _rurMetrics = Nothing
    }

-- | Each Struct must parallel DFE worker metrics protos (eg., cpu_time
-- metric will have nested values “timestamp_ms, total_ms, rate”).
rurMetrics :: Lens' ResourceUtilizationReport [ResourceUtilizationReportMetricsItem]
rurMetrics
  = lens _rurMetrics (\ s a -> s{_rurMetrics = a}) .
      _Default
      . _Coerce

instance FromJSON ResourceUtilizationReport where
        parseJSON
          = withObject "ResourceUtilizationReport"
              (\ o ->
                 ResourceUtilizationReport' <$>
                   (o .:? "metrics" .!= mempty))

instance ToJSON ResourceUtilizationReport where
        toJSON ResourceUtilizationReport'{..}
          = object (catMaybes [("metrics" .=) <$> _rurMetrics])

-- | Indicates which location failed to respond to a request for data.
--
-- /See:/ 'failedLocation' smart constructor.
newtype FailedLocation = FailedLocation'
    { _flName :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'FailedLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'flName'
failedLocation
    :: FailedLocation
failedLocation =
    FailedLocation'
    { _flName = Nothing
    }

-- | The name of the failed location.
flName :: Lens' FailedLocation (Maybe Text)
flName = lens _flName (\ s a -> s{_flName = a})

instance FromJSON FailedLocation where
        parseJSON
          = withObject "FailedLocation"
              (\ o -> FailedLocation' <$> (o .:? "name"))

instance ToJSON FailedLocation where
        toJSON FailedLocation'{..}
          = object (catMaybes [("name" .=) <$> _flName])

-- | A worker_message response allows the server to pass information to the
-- sender.
--
-- /See:/ 'workerMessageResponse' smart constructor.
data WorkerMessageResponse = WorkerMessageResponse'
    { _wmrWorkerHealthReportResponse :: !(Maybe WorkerHealthReportResponse)
    , _wmrWorkerMetricsResponse      :: !(Maybe ResourceUtilizationReportResponse)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerMessageResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wmrWorkerHealthReportResponse'
--
-- * 'wmrWorkerMetricsResponse'
workerMessageResponse
    :: WorkerMessageResponse
workerMessageResponse =
    WorkerMessageResponse'
    { _wmrWorkerHealthReportResponse = Nothing
    , _wmrWorkerMetricsResponse = Nothing
    }

-- | The service\'s response to a worker\'s health report.
wmrWorkerHealthReportResponse :: Lens' WorkerMessageResponse (Maybe WorkerHealthReportResponse)
wmrWorkerHealthReportResponse
  = lens _wmrWorkerHealthReportResponse
      (\ s a -> s{_wmrWorkerHealthReportResponse = a})

-- | Service\'s response to reporting worker metrics (currently empty).
wmrWorkerMetricsResponse :: Lens' WorkerMessageResponse (Maybe ResourceUtilizationReportResponse)
wmrWorkerMetricsResponse
  = lens _wmrWorkerMetricsResponse
      (\ s a -> s{_wmrWorkerMetricsResponse = a})

instance FromJSON WorkerMessageResponse where
        parseJSON
          = withObject "WorkerMessageResponse"
              (\ o ->
                 WorkerMessageResponse' <$>
                   (o .:? "workerHealthReportResponse") <*>
                     (o .:? "workerMetricsResponse"))

instance ToJSON WorkerMessageResponse where
        toJSON WorkerMessageResponse'{..}
          = object
              (catMaybes
                 [("workerHealthReportResponse" .=) <$>
                    _wmrWorkerHealthReportResponse,
                  ("workerMetricsResponse" .=) <$>
                    _wmrWorkerMetricsResponse])

-- | The runtime parameters to pass to the job.
--
-- /See:/ 'createJobFromTemplateRequestParameters' smart constructor.
newtype CreateJobFromTemplateRequestParameters = CreateJobFromTemplateRequestParameters'
    { _cjftrpAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CreateJobFromTemplateRequestParameters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cjftrpAddtional'
createJobFromTemplateRequestParameters
    :: HashMap Text Text -- ^ 'cjftrpAddtional'
    -> CreateJobFromTemplateRequestParameters
createJobFromTemplateRequestParameters pCjftrpAddtional_ =
    CreateJobFromTemplateRequestParameters'
    { _cjftrpAddtional = _Coerce # pCjftrpAddtional_
    }

cjftrpAddtional :: Lens' CreateJobFromTemplateRequestParameters (HashMap Text Text)
cjftrpAddtional
  = lens _cjftrpAddtional
      (\ s a -> s{_cjftrpAddtional = a})
      . _Coerce

instance FromJSON
         CreateJobFromTemplateRequestParameters where
        parseJSON
          = withObject "CreateJobFromTemplateRequestParameters"
              (\ o ->
                 CreateJobFromTemplateRequestParameters' <$>
                   (parseJSONObject o))

instance ToJSON
         CreateJobFromTemplateRequestParameters where
        toJSON = toJSON . _cjftrpAddtional

-- | The Dataflow service\'s idea of the current state of a WorkItem being
-- processed by a worker.
--
-- /See:/ 'workItemServiceState' smart constructor.
data WorkItemServiceState = WorkItemServiceState'
    { _wissNextReportIndex       :: !(Maybe (Textual Int64))
    , _wissReportStatusInterval  :: !(Maybe Text)
    , _wissHarnessData           :: !(Maybe WorkItemServiceStateHarnessData)
    , _wissSuggestedStopPoint    :: !(Maybe ApproximateProgress)
    , _wissSuggestedStopPosition :: !(Maybe Position)
    , _wissLeaseExpireTime       :: !(Maybe Text)
    , _wissSplitRequest          :: !(Maybe ApproximateSplitRequest)
    , _wissMetricShortId         :: !(Maybe [MetricShortId])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkItemServiceState' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wissNextReportIndex'
--
-- * 'wissReportStatusInterval'
--
-- * 'wissHarnessData'
--
-- * 'wissSuggestedStopPoint'
--
-- * 'wissSuggestedStopPosition'
--
-- * 'wissLeaseExpireTime'
--
-- * 'wissSplitRequest'
--
-- * 'wissMetricShortId'
workItemServiceState
    :: WorkItemServiceState
workItemServiceState =
    WorkItemServiceState'
    { _wissNextReportIndex = Nothing
    , _wissReportStatusInterval = Nothing
    , _wissHarnessData = Nothing
    , _wissSuggestedStopPoint = Nothing
    , _wissSuggestedStopPosition = Nothing
    , _wissLeaseExpireTime = Nothing
    , _wissSplitRequest = Nothing
    , _wissMetricShortId = Nothing
    }

-- | The index value to use for the next report sent by the worker. Note: If
-- the report call fails for whatever reason, the worker should reuse this
-- index for subsequent report attempts.
wissNextReportIndex :: Lens' WorkItemServiceState (Maybe Int64)
wissNextReportIndex
  = lens _wissNextReportIndex
      (\ s a -> s{_wissNextReportIndex = a})
      . mapping _Coerce

-- | New recommended reporting interval.
wissReportStatusInterval :: Lens' WorkItemServiceState (Maybe Text)
wissReportStatusInterval
  = lens _wissReportStatusInterval
      (\ s a -> s{_wissReportStatusInterval = a})

-- | Other data returned by the service, specific to the particular worker
-- harness.
wissHarnessData :: Lens' WorkItemServiceState (Maybe WorkItemServiceStateHarnessData)
wissHarnessData
  = lens _wissHarnessData
      (\ s a -> s{_wissHarnessData = a})

-- | DEPRECATED in favor of split_request.
wissSuggestedStopPoint :: Lens' WorkItemServiceState (Maybe ApproximateProgress)
wissSuggestedStopPoint
  = lens _wissSuggestedStopPoint
      (\ s a -> s{_wissSuggestedStopPoint = a})

-- | Obsolete, always empty.
wissSuggestedStopPosition :: Lens' WorkItemServiceState (Maybe Position)
wissSuggestedStopPosition
  = lens _wissSuggestedStopPosition
      (\ s a -> s{_wissSuggestedStopPosition = a})

-- | Time at which the current lease will expire.
wissLeaseExpireTime :: Lens' WorkItemServiceState (Maybe Text)
wissLeaseExpireTime
  = lens _wissLeaseExpireTime
      (\ s a -> s{_wissLeaseExpireTime = a})

-- | The progress point in the WorkItem where the Dataflow service suggests
-- that the worker truncate the task.
wissSplitRequest :: Lens' WorkItemServiceState (Maybe ApproximateSplitRequest)
wissSplitRequest
  = lens _wissSplitRequest
      (\ s a -> s{_wissSplitRequest = a})

-- | The short ids that workers should use in subsequent metric updates.
-- Workers should strive to use short ids whenever possible, but it is ok
-- to request the short_id again if a worker lost track of it (e.g. if the
-- worker is recovering from a crash). NOTE: it is possible that the
-- response may have short ids for a subset of the metrics.
wissMetricShortId :: Lens' WorkItemServiceState [MetricShortId]
wissMetricShortId
  = lens _wissMetricShortId
      (\ s a -> s{_wissMetricShortId = a})
      . _Default
      . _Coerce

instance FromJSON WorkItemServiceState where
        parseJSON
          = withObject "WorkItemServiceState"
              (\ o ->
                 WorkItemServiceState' <$>
                   (o .:? "nextReportIndex") <*>
                     (o .:? "reportStatusInterval")
                     <*> (o .:? "harnessData")
                     <*> (o .:? "suggestedStopPoint")
                     <*> (o .:? "suggestedStopPosition")
                     <*> (o .:? "leaseExpireTime")
                     <*> (o .:? "splitRequest")
                     <*> (o .:? "metricShortId" .!= mempty))

instance ToJSON WorkItemServiceState where
        toJSON WorkItemServiceState'{..}
          = object
              (catMaybes
                 [("nextReportIndex" .=) <$> _wissNextReportIndex,
                  ("reportStatusInterval" .=) <$>
                    _wissReportStatusInterval,
                  ("harnessData" .=) <$> _wissHarnessData,
                  ("suggestedStopPoint" .=) <$>
                    _wissSuggestedStopPoint,
                  ("suggestedStopPosition" .=) <$>
                    _wissSuggestedStopPosition,
                  ("leaseExpireTime" .=) <$> _wissLeaseExpireTime,
                  ("splitRequest" .=) <$> _wissSplitRequest,
                  ("metricShortId" .=) <$> _wissMetricShortId])

-- | A task which initializes part of a streaming Dataflow job.
--
-- /See:/ 'streamingSetupTask' smart constructor.
data StreamingSetupTask = StreamingSetupTask'
    { _sstStreamingComputationTopology :: !(Maybe TopologyConfig)
    , _sstReceiveWorkPort              :: !(Maybe (Textual Int32))
    , _sstWorkerHarnessPort            :: !(Maybe (Textual Int32))
    , _sstDrain                        :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingSetupTask' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sstStreamingComputationTopology'
--
-- * 'sstReceiveWorkPort'
--
-- * 'sstWorkerHarnessPort'
--
-- * 'sstDrain'
streamingSetupTask
    :: StreamingSetupTask
streamingSetupTask =
    StreamingSetupTask'
    { _sstStreamingComputationTopology = Nothing
    , _sstReceiveWorkPort = Nothing
    , _sstWorkerHarnessPort = Nothing
    , _sstDrain = Nothing
    }

-- | The global topology of the streaming Dataflow job.
sstStreamingComputationTopology :: Lens' StreamingSetupTask (Maybe TopologyConfig)
sstStreamingComputationTopology
  = lens _sstStreamingComputationTopology
      (\ s a -> s{_sstStreamingComputationTopology = a})

-- | The TCP port on which the worker should listen for messages from other
-- streaming computation workers.
sstReceiveWorkPort :: Lens' StreamingSetupTask (Maybe Int32)
sstReceiveWorkPort
  = lens _sstReceiveWorkPort
      (\ s a -> s{_sstReceiveWorkPort = a})
      . mapping _Coerce

-- | The TCP port used by the worker to communicate with the Dataflow worker
-- harness.
sstWorkerHarnessPort :: Lens' StreamingSetupTask (Maybe Int32)
sstWorkerHarnessPort
  = lens _sstWorkerHarnessPort
      (\ s a -> s{_sstWorkerHarnessPort = a})
      . mapping _Coerce

-- | The user has requested drain.
sstDrain :: Lens' StreamingSetupTask (Maybe Bool)
sstDrain = lens _sstDrain (\ s a -> s{_sstDrain = a})

instance FromJSON StreamingSetupTask where
        parseJSON
          = withObject "StreamingSetupTask"
              (\ o ->
                 StreamingSetupTask' <$>
                   (o .:? "streamingComputationTopology") <*>
                     (o .:? "receiveWorkPort")
                     <*> (o .:? "workerHarnessPort")
                     <*> (o .:? "drain"))

instance ToJSON StreamingSetupTask where
        toJSON StreamingSetupTask'{..}
          = object
              (catMaybes
                 [("streamingComputationTopology" .=) <$>
                    _sstStreamingComputationTopology,
                  ("receiveWorkPort" .=) <$> _sstReceiveWorkPort,
                  ("workerHarnessPort" .=) <$> _sstWorkerHarnessPort,
                  ("drain" .=) <$> _sstDrain])

-- | The codec to use for interpreting an element in the input PTable.
--
-- /See:/ 'partialGroupByKeyInstructionInputElementCodec' smart constructor.
newtype PartialGroupByKeyInstructionInputElementCodec = PartialGroupByKeyInstructionInputElementCodec'
    { _pgbkiiecAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PartialGroupByKeyInstructionInputElementCodec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pgbkiiecAddtional'
partialGroupByKeyInstructionInputElementCodec
    :: HashMap Text JSONValue -- ^ 'pgbkiiecAddtional'
    -> PartialGroupByKeyInstructionInputElementCodec
partialGroupByKeyInstructionInputElementCodec pPgbkiiecAddtional_ =
    PartialGroupByKeyInstructionInputElementCodec'
    { _pgbkiiecAddtional = _Coerce # pPgbkiiecAddtional_
    }

-- | Properties of the object.
pgbkiiecAddtional :: Lens' PartialGroupByKeyInstructionInputElementCodec (HashMap Text JSONValue)
pgbkiiecAddtional
  = lens _pgbkiiecAddtional
      (\ s a -> s{_pgbkiiecAddtional = a})
      . _Coerce

instance FromJSON
         PartialGroupByKeyInstructionInputElementCodec where
        parseJSON
          = withObject
              "PartialGroupByKeyInstructionInputElementCodec"
              (\ o ->
                 PartialGroupByKeyInstructionInputElementCodec' <$>
                   (parseJSONObject o))

instance ToJSON
         PartialGroupByKeyInstructionInputElementCodec where
        toJSON = toJSON . _pgbkiiecAddtional

-- | MapTask consists of an ordered set of instructions, each of which
-- describes one particular low-level operation for the worker to perform
-- in order to accomplish the MapTask\'s WorkItem. Each instruction must
-- appear in the list before any instructions which depends on its output.
--
-- /See:/ 'mapTask' smart constructor.
data MapTask = MapTask'
    { _mtInstructions :: !(Maybe [ParallelInstruction])
    , _mtSystemName   :: !(Maybe Text)
    , _mtStageName    :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MapTask' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mtInstructions'
--
-- * 'mtSystemName'
--
-- * 'mtStageName'
mapTask
    :: MapTask
mapTask =
    MapTask'
    { _mtInstructions = Nothing
    , _mtSystemName = Nothing
    , _mtStageName = Nothing
    }

-- | The instructions in the MapTask.
mtInstructions :: Lens' MapTask [ParallelInstruction]
mtInstructions
  = lens _mtInstructions
      (\ s a -> s{_mtInstructions = a})
      . _Default
      . _Coerce

-- | System-defined name of this MapTask. Unique across the workflow.
mtSystemName :: Lens' MapTask (Maybe Text)
mtSystemName
  = lens _mtSystemName (\ s a -> s{_mtSystemName = a})

-- | System-defined name of the stage containing this MapTask. Unique across
-- the workflow.
mtStageName :: Lens' MapTask (Maybe Text)
mtStageName
  = lens _mtStageName (\ s a -> s{_mtStageName = a})

instance FromJSON MapTask where
        parseJSON
          = withObject "MapTask"
              (\ o ->
                 MapTask' <$>
                   (o .:? "instructions" .!= mempty) <*>
                     (o .:? "systemName")
                     <*> (o .:? "stageName"))

instance ToJSON MapTask where
        toJSON MapTask'{..}
          = object
              (catMaybes
                 [("instructions" .=) <$> _mtInstructions,
                  ("systemName" .=) <$> _mtSystemName,
                  ("stageName" .=) <$> _mtStageName])

-- | Describes mounted data disk.
--
-- /See:/ 'mountedDataDisk' smart constructor.
newtype MountedDataDisk = MountedDataDisk'
    { _mddDataDisk :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MountedDataDisk' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'mddDataDisk'
mountedDataDisk
    :: MountedDataDisk
mountedDataDisk =
    MountedDataDisk'
    { _mddDataDisk = Nothing
    }

-- | The name of the data disk. This name is local to the Google Cloud
-- Platform project and uniquely identifies the disk within that project,
-- for example \"myproject-1014-104817-4c2-harness-0-disk-1\".
mddDataDisk :: Lens' MountedDataDisk (Maybe Text)
mddDataDisk
  = lens _mddDataDisk (\ s a -> s{_mddDataDisk = a})

instance FromJSON MountedDataDisk where
        parseJSON
          = withObject "MountedDataDisk"
              (\ o -> MountedDataDisk' <$> (o .:? "dataDisk"))

instance ToJSON MountedDataDisk where
        toJSON MountedDataDisk'{..}
          = object
              (catMaybes [("dataDisk" .=) <$> _mddDataDisk])

-- | The codec to use to encode data written to the sink.
--
-- /See:/ 'sinkCodec' smart constructor.
newtype SinkCodec = SinkCodec'
    { _scAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SinkCodec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'scAddtional'
sinkCodec
    :: HashMap Text JSONValue -- ^ 'scAddtional'
    -> SinkCodec
sinkCodec pScAddtional_ =
    SinkCodec'
    { _scAddtional = _Coerce # pScAddtional_
    }

-- | Properties of the object.
scAddtional :: Lens' SinkCodec (HashMap Text JSONValue)
scAddtional
  = lens _scAddtional (\ s a -> s{_scAddtional = a}) .
      _Coerce

instance FromJSON SinkCodec where
        parseJSON
          = withObject "SinkCodec"
              (\ o -> SinkCodec' <$> (parseJSONObject o))

instance ToJSON SinkCodec where
        toJSON = toJSON . _scAddtional

-- | A representation of an integer mean metric contribution.
--
-- /See:/ 'integerMean' smart constructor.
data IntegerMean = IntegerMean'
    { _imCount :: !(Maybe SplitInt64)
    , _imSum   :: !(Maybe SplitInt64)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'IntegerMean' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'imCount'
--
-- * 'imSum'
integerMean
    :: IntegerMean
integerMean =
    IntegerMean'
    { _imCount = Nothing
    , _imSum = Nothing
    }

-- | The number of values being aggregated.
imCount :: Lens' IntegerMean (Maybe SplitInt64)
imCount = lens _imCount (\ s a -> s{_imCount = a})

-- | The sum of all values being aggregated.
imSum :: Lens' IntegerMean (Maybe SplitInt64)
imSum = lens _imSum (\ s a -> s{_imSum = a})

instance FromJSON IntegerMean where
        parseJSON
          = withObject "IntegerMean"
              (\ o ->
                 IntegerMean' <$> (o .:? "count") <*> (o .:? "sum"))

instance ToJSON IntegerMean where
        toJSON IntegerMean'{..}
          = object
              (catMaybes
                 [("count" .=) <$> _imCount, ("sum" .=) <$> _imSum])

--
-- /See:/ 'workerHealthReportPodsItem' smart constructor.
newtype WorkerHealthReportPodsItem = WorkerHealthReportPodsItem'
    { _whrpiAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerHealthReportPodsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'whrpiAddtional'
workerHealthReportPodsItem
    :: HashMap Text JSONValue -- ^ 'whrpiAddtional'
    -> WorkerHealthReportPodsItem
workerHealthReportPodsItem pWhrpiAddtional_ =
    WorkerHealthReportPodsItem'
    { _whrpiAddtional = _Coerce # pWhrpiAddtional_
    }

-- | Properties of the object.
whrpiAddtional :: Lens' WorkerHealthReportPodsItem (HashMap Text JSONValue)
whrpiAddtional
  = lens _whrpiAddtional
      (\ s a -> s{_whrpiAddtional = a})
      . _Coerce

instance FromJSON WorkerHealthReportPodsItem where
        parseJSON
          = withObject "WorkerHealthReportPodsItem"
              (\ o ->
                 WorkerHealthReportPodsItem' <$> (parseJSONObject o))

instance ToJSON WorkerHealthReportPodsItem where
        toJSON = toJSON . _whrpiAddtional

-- | The user function to invoke.
--
-- /See:/ 'parDoInstructionUserFn' smart constructor.
newtype ParDoInstructionUserFn = ParDoInstructionUserFn'
    { _pdiufAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ParDoInstructionUserFn' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pdiufAddtional'
parDoInstructionUserFn
    :: HashMap Text JSONValue -- ^ 'pdiufAddtional'
    -> ParDoInstructionUserFn
parDoInstructionUserFn pPdiufAddtional_ =
    ParDoInstructionUserFn'
    { _pdiufAddtional = _Coerce # pPdiufAddtional_
    }

-- | Properties of the object.
pdiufAddtional :: Lens' ParDoInstructionUserFn (HashMap Text JSONValue)
pdiufAddtional
  = lens _pdiufAddtional
      (\ s a -> s{_pdiufAddtional = a})
      . _Coerce

instance FromJSON ParDoInstructionUserFn where
        parseJSON
          = withObject "ParDoInstructionUserFn"
              (\ o ->
                 ParDoInstructionUserFn' <$> (parseJSONObject o))

instance ToJSON ParDoInstructionUserFn where
        toJSON = toJSON . _pdiufAddtional

-- | The codec to use to encode data being written via this output.
--
-- /See:/ 'instructionOutputCodec' smart constructor.
newtype InstructionOutputCodec = InstructionOutputCodec'
    { _iocAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'InstructionOutputCodec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'iocAddtional'
instructionOutputCodec
    :: HashMap Text JSONValue -- ^ 'iocAddtional'
    -> InstructionOutputCodec
instructionOutputCodec pIocAddtional_ =
    InstructionOutputCodec'
    { _iocAddtional = _Coerce # pIocAddtional_
    }

-- | Properties of the object.
iocAddtional :: Lens' InstructionOutputCodec (HashMap Text JSONValue)
iocAddtional
  = lens _iocAddtional (\ s a -> s{_iocAddtional = a})
      . _Coerce

instance FromJSON InstructionOutputCodec where
        parseJSON
          = withObject "InstructionOutputCodec"
              (\ o ->
                 InstructionOutputCodec' <$> (parseJSONObject o))

instance ToJSON InstructionOutputCodec where
        toJSON = toJSON . _iocAddtional

-- | Describes a stream of data, either as input to be processed or as output
-- of a streaming Dataflow job.
--
-- /See:/ 'streamLocation' smart constructor.
data StreamLocation = StreamLocation'
    { _slStreamingStageLocation :: !(Maybe StreamingStageLocation)
    , _slSideInputLocation      :: !(Maybe StreamingSideInputLocation)
    , _slCustomSourceLocation   :: !(Maybe CustomSourceLocation)
    , _slPubsubLocation         :: !(Maybe PubsubLocation)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'slStreamingStageLocation'
--
-- * 'slSideInputLocation'
--
-- * 'slCustomSourceLocation'
--
-- * 'slPubsubLocation'
streamLocation
    :: StreamLocation
streamLocation =
    StreamLocation'
    { _slStreamingStageLocation = Nothing
    , _slSideInputLocation = Nothing
    , _slCustomSourceLocation = Nothing
    , _slPubsubLocation = Nothing
    }

-- | The stream is part of another computation within the current streaming
-- Dataflow job.
slStreamingStageLocation :: Lens' StreamLocation (Maybe StreamingStageLocation)
slStreamingStageLocation
  = lens _slStreamingStageLocation
      (\ s a -> s{_slStreamingStageLocation = a})

-- | The stream is a streaming side input.
slSideInputLocation :: Lens' StreamLocation (Maybe StreamingSideInputLocation)
slSideInputLocation
  = lens _slSideInputLocation
      (\ s a -> s{_slSideInputLocation = a})

-- | The stream is a custom source.
slCustomSourceLocation :: Lens' StreamLocation (Maybe CustomSourceLocation)
slCustomSourceLocation
  = lens _slCustomSourceLocation
      (\ s a -> s{_slCustomSourceLocation = a})

-- | The stream is a pubsub stream.
slPubsubLocation :: Lens' StreamLocation (Maybe PubsubLocation)
slPubsubLocation
  = lens _slPubsubLocation
      (\ s a -> s{_slPubsubLocation = a})

instance FromJSON StreamLocation where
        parseJSON
          = withObject "StreamLocation"
              (\ o ->
                 StreamLocation' <$>
                   (o .:? "streamingStageLocation") <*>
                     (o .:? "sideInputLocation")
                     <*> (o .:? "customSourceLocation")
                     <*> (o .:? "pubsubLocation"))

instance ToJSON StreamLocation where
        toJSON StreamLocation'{..}
          = object
              (catMaybes
                 [("streamingStageLocation" .=) <$>
                    _slStreamingStageLocation,
                  ("sideInputLocation" .=) <$> _slSideInputLocation,
                  ("customSourceLocation" .=) <$>
                    _slCustomSourceLocation,
                  ("pubsubLocation" .=) <$> _slPubsubLocation])

-- | Extra arguments for this worker pool.
--
-- /See:/ 'workerPoolPoolArgs' smart constructor.
newtype WorkerPoolPoolArgs = WorkerPoolPoolArgs'
    { _wppaAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerPoolPoolArgs' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wppaAddtional'
workerPoolPoolArgs
    :: HashMap Text JSONValue -- ^ 'wppaAddtional'
    -> WorkerPoolPoolArgs
workerPoolPoolArgs pWppaAddtional_ =
    WorkerPoolPoolArgs'
    { _wppaAddtional = _Coerce # pWppaAddtional_
    }

-- | Properties of the object. Contains field \'type with type URL.
wppaAddtional :: Lens' WorkerPoolPoolArgs (HashMap Text JSONValue)
wppaAddtional
  = lens _wppaAddtional
      (\ s a -> s{_wppaAddtional = a})
      . _Coerce

instance FromJSON WorkerPoolPoolArgs where
        parseJSON
          = withObject "WorkerPoolPoolArgs"
              (\ o -> WorkerPoolPoolArgs' <$> (parseJSONObject o))

instance ToJSON WorkerPoolPoolArgs where
        toJSON = toJSON . _wppaAddtional

-- | The environment values to set at runtime.
--
-- /See:/ 'runtimeEnvironment' smart constructor.
data RuntimeEnvironment = RuntimeEnvironment'
    { _reZone                    :: !(Maybe Text)
    , _reBypassTempDirValidation :: !(Maybe Bool)
    , _reServiceAccountEmail     :: !(Maybe Text)
    , _reMaxWorkers              :: !(Maybe (Textual Int32))
    , _reTempLocation            :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'RuntimeEnvironment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'reZone'
--
-- * 'reBypassTempDirValidation'
--
-- * 'reServiceAccountEmail'
--
-- * 'reMaxWorkers'
--
-- * 'reTempLocation'
runtimeEnvironment
    :: RuntimeEnvironment
runtimeEnvironment =
    RuntimeEnvironment'
    { _reZone = Nothing
    , _reBypassTempDirValidation = Nothing
    , _reServiceAccountEmail = Nothing
    , _reMaxWorkers = Nothing
    , _reTempLocation = Nothing
    }

-- | The Compute Engine [availability
-- zone](https:\/\/cloud.google.com\/compute\/docs\/regions-zones\/regions-zones)
-- for launching worker instances to run your pipeline.
reZone :: Lens' RuntimeEnvironment (Maybe Text)
reZone = lens _reZone (\ s a -> s{_reZone = a})

-- | Whether to bypass the safety checks for the job\'s temporary directory.
-- Use with caution.
reBypassTempDirValidation :: Lens' RuntimeEnvironment (Maybe Bool)
reBypassTempDirValidation
  = lens _reBypassTempDirValidation
      (\ s a -> s{_reBypassTempDirValidation = a})

-- | The email address of the service account to run the job as.
reServiceAccountEmail :: Lens' RuntimeEnvironment (Maybe Text)
reServiceAccountEmail
  = lens _reServiceAccountEmail
      (\ s a -> s{_reServiceAccountEmail = a})

-- | The maximum number of Google Compute Engine instances to be made
-- available to your pipeline during execution, from 1 to 1000.
reMaxWorkers :: Lens' RuntimeEnvironment (Maybe Int32)
reMaxWorkers
  = lens _reMaxWorkers (\ s a -> s{_reMaxWorkers = a})
      . mapping _Coerce

-- | The Cloud Storage path to use for temporary files. Must be a valid Cloud
-- Storage URL, beginning with \`gs:\/\/\`.
reTempLocation :: Lens' RuntimeEnvironment (Maybe Text)
reTempLocation
  = lens _reTempLocation
      (\ s a -> s{_reTempLocation = a})

instance FromJSON RuntimeEnvironment where
        parseJSON
          = withObject "RuntimeEnvironment"
              (\ o ->
                 RuntimeEnvironment' <$>
                   (o .:? "zone") <*> (o .:? "bypassTempDirValidation")
                     <*> (o .:? "serviceAccountEmail")
                     <*> (o .:? "maxWorkers")
                     <*> (o .:? "tempLocation"))

instance ToJSON RuntimeEnvironment where
        toJSON RuntimeEnvironment'{..}
          = object
              (catMaybes
                 [("zone" .=) <$> _reZone,
                  ("bypassTempDirValidation" .=) <$>
                    _reBypassTempDirValidation,
                  ("serviceAccountEmail" .=) <$>
                    _reServiceAccountEmail,
                  ("maxWorkers" .=) <$> _reMaxWorkers,
                  ("tempLocation" .=) <$> _reTempLocation])

-- | CounterMetadata includes all static non-name non-value counter
-- attributes.
--
-- /See:/ 'counterMetadata' smart constructor.
data CounterMetadata = CounterMetadata'
    { _cmKind          :: !(Maybe Text)
    , _cmDescription   :: !(Maybe Text)
    , _cmStandardUnits :: !(Maybe Text)
    , _cmOtherUnits    :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CounterMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cmKind'
--
-- * 'cmDescription'
--
-- * 'cmStandardUnits'
--
-- * 'cmOtherUnits'
counterMetadata
    :: CounterMetadata
counterMetadata =
    CounterMetadata'
    { _cmKind = Nothing
    , _cmDescription = Nothing
    , _cmStandardUnits = Nothing
    , _cmOtherUnits = Nothing
    }

-- | Counter aggregation kind.
cmKind :: Lens' CounterMetadata (Maybe Text)
cmKind = lens _cmKind (\ s a -> s{_cmKind = a})

-- | Human-readable description of the counter semantics.
cmDescription :: Lens' CounterMetadata (Maybe Text)
cmDescription
  = lens _cmDescription
      (\ s a -> s{_cmDescription = a})

-- | System defined Units, see above enum.
cmStandardUnits :: Lens' CounterMetadata (Maybe Text)
cmStandardUnits
  = lens _cmStandardUnits
      (\ s a -> s{_cmStandardUnits = a})

-- | A string referring to the unit type.
cmOtherUnits :: Lens' CounterMetadata (Maybe Text)
cmOtherUnits
  = lens _cmOtherUnits (\ s a -> s{_cmOtherUnits = a})

instance FromJSON CounterMetadata where
        parseJSON
          = withObject "CounterMetadata"
              (\ o ->
                 CounterMetadata' <$>
                   (o .:? "kind") <*> (o .:? "description") <*>
                     (o .:? "standardUnits")
                     <*> (o .:? "otherUnits"))

instance ToJSON CounterMetadata where
        toJSON CounterMetadata'{..}
          = object
              (catMaybes
                 [("kind" .=) <$> _cmKind,
                  ("description" .=) <$> _cmDescription,
                  ("standardUnits" .=) <$> _cmStandardUnits,
                  ("otherUnits" .=) <$> _cmOtherUnits])

-- | The response to the worker messages.
--
-- /See:/ 'sendWorkerMessagesResponse' smart constructor.
newtype SendWorkerMessagesResponse = SendWorkerMessagesResponse'
    { _swmrWorkerMessageResponses :: Maybe [WorkerMessageResponse]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SendWorkerMessagesResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'swmrWorkerMessageResponses'
sendWorkerMessagesResponse
    :: SendWorkerMessagesResponse
sendWorkerMessagesResponse =
    SendWorkerMessagesResponse'
    { _swmrWorkerMessageResponses = Nothing
    }

-- | The servers response to the worker messages.
swmrWorkerMessageResponses :: Lens' SendWorkerMessagesResponse [WorkerMessageResponse]
swmrWorkerMessageResponses
  = lens _swmrWorkerMessageResponses
      (\ s a -> s{_swmrWorkerMessageResponses = a})
      . _Default
      . _Coerce

instance FromJSON SendWorkerMessagesResponse where
        parseJSON
          = withObject "SendWorkerMessagesResponse"
              (\ o ->
                 SendWorkerMessagesResponse' <$>
                   (o .:? "workerMessageResponses" .!= mempty))

instance ToJSON SendWorkerMessagesResponse where
        toJSON SendWorkerMessagesResponse'{..}
          = object
              (catMaybes
                 [("workerMessageResponses" .=) <$>
                    _swmrWorkerMessageResponses])

-- | Identifies the location of a streaming side input.
--
-- /See:/ 'streamingSideInputLocation' smart constructor.
data StreamingSideInputLocation = StreamingSideInputLocation'
    { _ssilTag         :: !(Maybe Text)
    , _ssilStateFamily :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingSideInputLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssilTag'
--
-- * 'ssilStateFamily'
streamingSideInputLocation
    :: StreamingSideInputLocation
streamingSideInputLocation =
    StreamingSideInputLocation'
    { _ssilTag = Nothing
    , _ssilStateFamily = Nothing
    }

-- | Identifies the particular side input within the streaming Dataflow job.
ssilTag :: Lens' StreamingSideInputLocation (Maybe Text)
ssilTag = lens _ssilTag (\ s a -> s{_ssilTag = a})

-- | Identifies the state family where this side input is stored.
ssilStateFamily :: Lens' StreamingSideInputLocation (Maybe Text)
ssilStateFamily
  = lens _ssilStateFamily
      (\ s a -> s{_ssilStateFamily = a})

instance FromJSON StreamingSideInputLocation where
        parseJSON
          = withObject "StreamingSideInputLocation"
              (\ o ->
                 StreamingSideInputLocation' <$>
                   (o .:? "tag") <*> (o .:? "stateFamily"))

instance ToJSON StreamingSideInputLocation where
        toJSON StreamingSideInputLocation'{..}
          = object
              (catMaybes
                 [("tag" .=) <$> _ssilTag,
                  ("stateFamily" .=) <$> _ssilStateFamily])

-- | Request to get updated debug configuration for component.
--
-- /See:/ 'getDebugConfigRequest' smart constructor.
data GetDebugConfigRequest = GetDebugConfigRequest'
    { _gdcrComponentId :: !(Maybe Text)
    , _gdcrWorkerId    :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'GetDebugConfigRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'gdcrComponentId'
--
-- * 'gdcrWorkerId'
getDebugConfigRequest
    :: GetDebugConfigRequest
getDebugConfigRequest =
    GetDebugConfigRequest'
    { _gdcrComponentId = Nothing
    , _gdcrWorkerId = Nothing
    }

-- | The internal component id for which debug configuration is requested.
gdcrComponentId :: Lens' GetDebugConfigRequest (Maybe Text)
gdcrComponentId
  = lens _gdcrComponentId
      (\ s a -> s{_gdcrComponentId = a})

-- | The worker id, i.e., VM hostname.
gdcrWorkerId :: Lens' GetDebugConfigRequest (Maybe Text)
gdcrWorkerId
  = lens _gdcrWorkerId (\ s a -> s{_gdcrWorkerId = a})

instance FromJSON GetDebugConfigRequest where
        parseJSON
          = withObject "GetDebugConfigRequest"
              (\ o ->
                 GetDebugConfigRequest' <$>
                   (o .:? "componentId") <*> (o .:? "workerId"))

instance ToJSON GetDebugConfigRequest where
        toJSON GetDebugConfigRequest'{..}
          = object
              (catMaybes
                 [("componentId" .=) <$> _gdcrComponentId,
                  ("workerId" .=) <$> _gdcrWorkerId])

-- | A single message which encapsulates structured name and metadata for a
-- given counter.
--
-- /See:/ 'counterStructuredNameAndMetadata' smart constructor.
data CounterStructuredNameAndMetadata = CounterStructuredNameAndMetadata'
    { _csnamName     :: !(Maybe CounterStructuredName)
    , _csnamMetadata :: !(Maybe CounterMetadata)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CounterStructuredNameAndMetadata' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'csnamName'
--
-- * 'csnamMetadata'
counterStructuredNameAndMetadata
    :: CounterStructuredNameAndMetadata
counterStructuredNameAndMetadata =
    CounterStructuredNameAndMetadata'
    { _csnamName = Nothing
    , _csnamMetadata = Nothing
    }

-- | Structured name of the counter.
csnamName :: Lens' CounterStructuredNameAndMetadata (Maybe CounterStructuredName)
csnamName
  = lens _csnamName (\ s a -> s{_csnamName = a})

-- | Metadata associated with a counter
csnamMetadata :: Lens' CounterStructuredNameAndMetadata (Maybe CounterMetadata)
csnamMetadata
  = lens _csnamMetadata
      (\ s a -> s{_csnamMetadata = a})

instance FromJSON CounterStructuredNameAndMetadata
         where
        parseJSON
          = withObject "CounterStructuredNameAndMetadata"
              (\ o ->
                 CounterStructuredNameAndMetadata' <$>
                   (o .:? "name") <*> (o .:? "metadata"))

instance ToJSON CounterStructuredNameAndMetadata
         where
        toJSON CounterStructuredNameAndMetadata'{..}
          = object
              (catMaybes
                 [("name" .=) <$> _csnamName,
                  ("metadata" .=) <$> _csnamMetadata])

-- | A task which describes what action should be performed for the specified
-- streaming computation ranges.
--
-- /See:/ 'streamingComputationTask' smart constructor.
data StreamingComputationTask = StreamingComputationTask'
    { _sctTaskType          :: !(Maybe Text)
    , _sctDataDisks         :: !(Maybe [MountedDataDisk])
    , _sctComputationRanges :: !(Maybe [StreamingComputationRanges])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingComputationTask' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sctTaskType'
--
-- * 'sctDataDisks'
--
-- * 'sctComputationRanges'
streamingComputationTask
    :: StreamingComputationTask
streamingComputationTask =
    StreamingComputationTask'
    { _sctTaskType = Nothing
    , _sctDataDisks = Nothing
    , _sctComputationRanges = Nothing
    }

-- | A type of streaming computation task.
sctTaskType :: Lens' StreamingComputationTask (Maybe Text)
sctTaskType
  = lens _sctTaskType (\ s a -> s{_sctTaskType = a})

-- | Describes the set of data disks this task should apply to.
sctDataDisks :: Lens' StreamingComputationTask [MountedDataDisk]
sctDataDisks
  = lens _sctDataDisks (\ s a -> s{_sctDataDisks = a})
      . _Default
      . _Coerce

-- | Contains ranges of a streaming computation this task should apply to.
sctComputationRanges :: Lens' StreamingComputationTask [StreamingComputationRanges]
sctComputationRanges
  = lens _sctComputationRanges
      (\ s a -> s{_sctComputationRanges = a})
      . _Default
      . _Coerce

instance FromJSON StreamingComputationTask where
        parseJSON
          = withObject "StreamingComputationTask"
              (\ o ->
                 StreamingComputationTask' <$>
                   (o .:? "taskType") <*> (o .:? "dataDisks" .!= mempty)
                     <*> (o .:? "computationRanges" .!= mempty))

instance ToJSON StreamingComputationTask where
        toJSON StreamingComputationTask'{..}
          = object
              (catMaybes
                 [("taskType" .=) <$> _sctTaskType,
                  ("dataDisks" .=) <$> _sctDataDisks,
                  ("computationRanges" .=) <$> _sctComputationRanges])

-- | A particular message pertaining to a Dataflow job.
--
-- /See:/ 'jobMessage' smart constructor.
data JobMessage = JobMessage'
    { _jmTime              :: !(Maybe Text)
    , _jmMessageText       :: !(Maybe Text)
    , _jmMessageImportance :: !(Maybe Text)
    , _jmId                :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobMessage' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jmTime'
--
-- * 'jmMessageText'
--
-- * 'jmMessageImportance'
--
-- * 'jmId'
jobMessage
    :: JobMessage
jobMessage =
    JobMessage'
    { _jmTime = Nothing
    , _jmMessageText = Nothing
    , _jmMessageImportance = Nothing
    , _jmId = Nothing
    }

-- | The timestamp of the message.
jmTime :: Lens' JobMessage (Maybe Text)
jmTime = lens _jmTime (\ s a -> s{_jmTime = a})

-- | The text of the message.
jmMessageText :: Lens' JobMessage (Maybe Text)
jmMessageText
  = lens _jmMessageText
      (\ s a -> s{_jmMessageText = a})

-- | Importance level of the message.
jmMessageImportance :: Lens' JobMessage (Maybe Text)
jmMessageImportance
  = lens _jmMessageImportance
      (\ s a -> s{_jmMessageImportance = a})

-- | Identifies the message. This is automatically generated by the service;
-- the caller should treat it as an opaque string.
jmId :: Lens' JobMessage (Maybe Text)
jmId = lens _jmId (\ s a -> s{_jmId = a})

instance FromJSON JobMessage where
        parseJSON
          = withObject "JobMessage"
              (\ o ->
                 JobMessage' <$>
                   (o .:? "time") <*> (o .:? "messageText") <*>
                     (o .:? "messageImportance")
                     <*> (o .:? "id"))

instance ToJSON JobMessage where
        toJSON JobMessage'{..}
          = object
              (catMaybes
                 [("time" .=) <$> _jmTime,
                  ("messageText" .=) <$> _jmMessageText,
                  ("messageImportance" .=) <$> _jmMessageImportance,
                  ("id" .=) <$> _jmId])

-- | Information about an output of a SeqMapTask.
--
-- /See:/ 'seqMapTaskOutputInfo' smart constructor.
data SeqMapTaskOutputInfo = SeqMapTaskOutputInfo'
    { _smtoiSink :: !(Maybe Sink)
    , _smtoiTag  :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SeqMapTaskOutputInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'smtoiSink'
--
-- * 'smtoiTag'
seqMapTaskOutputInfo
    :: SeqMapTaskOutputInfo
seqMapTaskOutputInfo =
    SeqMapTaskOutputInfo'
    { _smtoiSink = Nothing
    , _smtoiTag = Nothing
    }

-- | The sink to write the output value to.
smtoiSink :: Lens' SeqMapTaskOutputInfo (Maybe Sink)
smtoiSink
  = lens _smtoiSink (\ s a -> s{_smtoiSink = a})

-- | The id of the TupleTag the user code will tag the output value by.
smtoiTag :: Lens' SeqMapTaskOutputInfo (Maybe Text)
smtoiTag = lens _smtoiTag (\ s a -> s{_smtoiTag = a})

instance FromJSON SeqMapTaskOutputInfo where
        parseJSON
          = withObject "SeqMapTaskOutputInfo"
              (\ o ->
                 SeqMapTaskOutputInfo' <$>
                   (o .:? "sink") <*> (o .:? "tag"))

instance ToJSON SeqMapTaskOutputInfo where
        toJSON SeqMapTaskOutputInfo'{..}
          = object
              (catMaybes
                 [("sink" .=) <$> _smtoiSink,
                  ("tag" .=) <$> _smtoiTag])

-- | A request to compute the SourceMetadata of a Source.
--
-- /See:/ 'sourceGetMetadataRequest' smart constructor.
newtype SourceGetMetadataRequest = SourceGetMetadataRequest'
    { _sgmrSource :: Maybe Source
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceGetMetadataRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sgmrSource'
sourceGetMetadataRequest
    :: SourceGetMetadataRequest
sourceGetMetadataRequest =
    SourceGetMetadataRequest'
    { _sgmrSource = Nothing
    }

-- | Specification of the source whose metadata should be computed.
sgmrSource :: Lens' SourceGetMetadataRequest (Maybe Source)
sgmrSource
  = lens _sgmrSource (\ s a -> s{_sgmrSource = a})

instance FromJSON SourceGetMetadataRequest where
        parseJSON
          = withObject "SourceGetMetadataRequest"
              (\ o ->
                 SourceGetMetadataRequest' <$> (o .:? "source"))

instance ToJSON SourceGetMetadataRequest where
        toJSON SourceGetMetadataRequest'{..}
          = object (catMaybes [("source" .=) <$> _sgmrSource])

-- | The user function to invoke.
--
-- /See:/ 'seqMapTaskUserFn' smart constructor.
newtype SeqMapTaskUserFn = SeqMapTaskUserFn'
    { _smtufAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SeqMapTaskUserFn' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'smtufAddtional'
seqMapTaskUserFn
    :: HashMap Text JSONValue -- ^ 'smtufAddtional'
    -> SeqMapTaskUserFn
seqMapTaskUserFn pSmtufAddtional_ =
    SeqMapTaskUserFn'
    { _smtufAddtional = _Coerce # pSmtufAddtional_
    }

-- | Properties of the object.
smtufAddtional :: Lens' SeqMapTaskUserFn (HashMap Text JSONValue)
smtufAddtional
  = lens _smtufAddtional
      (\ s a -> s{_smtufAddtional = a})
      . _Coerce

instance FromJSON SeqMapTaskUserFn where
        parseJSON
          = withObject "SeqMapTaskUserFn"
              (\ o -> SeqMapTaskUserFn' <$> (parseJSONObject o))

instance ToJSON SeqMapTaskUserFn where
        toJSON = toJSON . _smtufAddtional

-- | The value combining function to invoke.
--
-- /See:/ 'partialGroupByKeyInstructionValueCombiningFn' smart constructor.
newtype PartialGroupByKeyInstructionValueCombiningFn = PartialGroupByKeyInstructionValueCombiningFn'
    { _pgbkivcfAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PartialGroupByKeyInstructionValueCombiningFn' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pgbkivcfAddtional'
partialGroupByKeyInstructionValueCombiningFn
    :: HashMap Text JSONValue -- ^ 'pgbkivcfAddtional'
    -> PartialGroupByKeyInstructionValueCombiningFn
partialGroupByKeyInstructionValueCombiningFn pPgbkivcfAddtional_ =
    PartialGroupByKeyInstructionValueCombiningFn'
    { _pgbkivcfAddtional = _Coerce # pPgbkivcfAddtional_
    }

-- | Properties of the object.
pgbkivcfAddtional :: Lens' PartialGroupByKeyInstructionValueCombiningFn (HashMap Text JSONValue)
pgbkivcfAddtional
  = lens _pgbkivcfAddtional
      (\ s a -> s{_pgbkivcfAddtional = a})
      . _Coerce

instance FromJSON
         PartialGroupByKeyInstructionValueCombiningFn where
        parseJSON
          = withObject
              "PartialGroupByKeyInstructionValueCombiningFn"
              (\ o ->
                 PartialGroupByKeyInstructionValueCombiningFn' <$>
                   (parseJSONObject o))

instance ToJSON
         PartialGroupByKeyInstructionValueCombiningFn where
        toJSON = toJSON . _pgbkivcfAddtional

-- | Defines a job to be run by the Cloud Dataflow service.
--
-- /See:/ 'job' smart constructor.
data Job = Job'
    { _jRequestedState       :: !(Maybe Text)
    , _jLocation             :: !(Maybe Text)
    , _jEnvironment          :: !(Maybe Environment)
    , _jClientRequestId      :: !(Maybe Text)
    , _jCurrentState         :: !(Maybe Text)
    , _jReplacedByJobId      :: !(Maybe Text)
    , _jTempFiles            :: !(Maybe [Text])
    , _jSteps                :: !(Maybe [Step])
    , _jExecutionInfo        :: !(Maybe JobExecutionInfo)
    , _jName                 :: !(Maybe Text)
    , _jTransformNameMApping :: !(Maybe JobTransformNameMApping)
    , _jId                   :: !(Maybe Text)
    , _jLabels               :: !(Maybe JobLabels)
    , _jProjectId            :: !(Maybe Text)
    , _jType                 :: !(Maybe Text)
    , _jCurrentStateTime     :: !(Maybe Text)
    , _jReplaceJobId         :: !(Maybe Text)
    , _jCreateTime           :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Job' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jRequestedState'
--
-- * 'jLocation'
--
-- * 'jEnvironment'
--
-- * 'jClientRequestId'
--
-- * 'jCurrentState'
--
-- * 'jReplacedByJobId'
--
-- * 'jTempFiles'
--
-- * 'jSteps'
--
-- * 'jExecutionInfo'
--
-- * 'jName'
--
-- * 'jTransformNameMApping'
--
-- * 'jId'
--
-- * 'jLabels'
--
-- * 'jProjectId'
--
-- * 'jType'
--
-- * 'jCurrentStateTime'
--
-- * 'jReplaceJobId'
--
-- * 'jCreateTime'
job
    :: Job
job =
    Job'
    { _jRequestedState = Nothing
    , _jLocation = Nothing
    , _jEnvironment = Nothing
    , _jClientRequestId = Nothing
    , _jCurrentState = Nothing
    , _jReplacedByJobId = Nothing
    , _jTempFiles = Nothing
    , _jSteps = Nothing
    , _jExecutionInfo = Nothing
    , _jName = Nothing
    , _jTransformNameMApping = Nothing
    , _jId = Nothing
    , _jLabels = Nothing
    , _jProjectId = Nothing
    , _jType = Nothing
    , _jCurrentStateTime = Nothing
    , _jReplaceJobId = Nothing
    , _jCreateTime = Nothing
    }

-- | The job\'s requested state. \`UpdateJob\` may be used to switch between
-- the \`JOB_STATE_STOPPED\` and \`JOB_STATE_RUNNING\` states, by setting
-- requested_state. \`UpdateJob\` may also be used to directly set a job\'s
-- requested state to \`JOB_STATE_CANCELLED\` or \`JOB_STATE_DONE\`,
-- irrevocably terminating the job if it has not already reached a terminal
-- state.
jRequestedState :: Lens' Job (Maybe Text)
jRequestedState
  = lens _jRequestedState
      (\ s a -> s{_jRequestedState = a})

-- | The location that contains this job.
jLocation :: Lens' Job (Maybe Text)
jLocation
  = lens _jLocation (\ s a -> s{_jLocation = a})

-- | The environment for the job.
jEnvironment :: Lens' Job (Maybe Environment)
jEnvironment
  = lens _jEnvironment (\ s a -> s{_jEnvironment = a})

-- | The client\'s unique identifier of the job, re-used across retried
-- attempts. If this field is set, the service will ensure its uniqueness.
-- The request to create a job will fail if the service has knowledge of a
-- previously submitted job with the same client\'s ID and job name. The
-- caller may use this field to ensure idempotence of job creation across
-- retried attempts to create a job. By default, the field is empty and, in
-- that case, the service ignores it.
jClientRequestId :: Lens' Job (Maybe Text)
jClientRequestId
  = lens _jClientRequestId
      (\ s a -> s{_jClientRequestId = a})

-- | The current state of the job. Jobs are created in the
-- \`JOB_STATE_STOPPED\` state unless otherwise specified. A job in the
-- \`JOB_STATE_RUNNING\` state may asynchronously enter a terminal state.
-- After a job has reached a terminal state, no further state updates may
-- be made. This field may be mutated by the Cloud Dataflow service;
-- callers cannot mutate it.
jCurrentState :: Lens' Job (Maybe Text)
jCurrentState
  = lens _jCurrentState
      (\ s a -> s{_jCurrentState = a})

-- | If another job is an update of this job (and thus, this job is in
-- \`JOB_STATE_UPDATED\`), this field contains the ID of that job.
jReplacedByJobId :: Lens' Job (Maybe Text)
jReplacedByJobId
  = lens _jReplacedByJobId
      (\ s a -> s{_jReplacedByJobId = a})

-- | A set of files the system should be aware of that are used for temporary
-- storage. These temporary files will be removed on job completion. No
-- duplicates are allowed. No file patterns are supported. The supported
-- files are: Google Cloud Storage:
-- storage.googleapis.com\/{bucket}\/{object}
-- bucket.storage.googleapis.com\/{object}
jTempFiles :: Lens' Job [Text]
jTempFiles
  = lens _jTempFiles (\ s a -> s{_jTempFiles = a}) .
      _Default
      . _Coerce

-- | The top-level steps that constitute the entire job.
jSteps :: Lens' Job [Step]
jSteps
  = lens _jSteps (\ s a -> s{_jSteps = a}) . _Default .
      _Coerce

-- | Information about how the Cloud Dataflow service will run the job.
jExecutionInfo :: Lens' Job (Maybe JobExecutionInfo)
jExecutionInfo
  = lens _jExecutionInfo
      (\ s a -> s{_jExecutionInfo = a})

-- | The user-specified Cloud Dataflow job name. Only one Job with a given
-- name may exist in a project at any given time. If a caller attempts to
-- create a Job with the same name as an already-existing Job, the attempt
-- returns the existing Job. The name must match the regular expression
-- \`[a-z]([-a-z0-9]{0,38}[a-z0-9])?\`
jName :: Lens' Job (Maybe Text)
jName = lens _jName (\ s a -> s{_jName = a})

-- | The map of transform name prefixes of the job to be replaced to the
-- corresponding name prefixes of the new job.
jTransformNameMApping :: Lens' Job (Maybe JobTransformNameMApping)
jTransformNameMApping
  = lens _jTransformNameMApping
      (\ s a -> s{_jTransformNameMApping = a})

-- | The unique ID of this job. This field is set by the Cloud Dataflow
-- service when the Job is created, and is immutable for the life of the
-- job.
jId :: Lens' Job (Maybe Text)
jId = lens _jId (\ s a -> s{_jId = a})

-- | User-defined labels for this job. The labels map can contain no more
-- than 64 entries. Entries of the labels map are UTF8 strings that comply
-- with the following restrictions: * Keys must conform to regexp:
-- \\p{Ll}\\p{Lo}{0,62} * Values must conform to regexp:
-- [\\p{Ll}\\p{Lo}\\p{N}_-]{0,63} * Both keys and values are additionally
-- constrained to be \<= 128 bytes in size.
jLabels :: Lens' Job (Maybe JobLabels)
jLabels = lens _jLabels (\ s a -> s{_jLabels = a})

-- | The ID of the Cloud Platform project that the job belongs to.
jProjectId :: Lens' Job (Maybe Text)
jProjectId
  = lens _jProjectId (\ s a -> s{_jProjectId = a})

-- | The type of Cloud Dataflow job.
jType :: Lens' Job (Maybe Text)
jType = lens _jType (\ s a -> s{_jType = a})

-- | The timestamp associated with the current state.
jCurrentStateTime :: Lens' Job (Maybe Text)
jCurrentStateTime
  = lens _jCurrentStateTime
      (\ s a -> s{_jCurrentStateTime = a})

-- | If this job is an update of an existing job, this field is the job ID of
-- the job it replaced. When sending a \`CreateJobRequest\`, you can update
-- a job by specifying it here. The job named here is stopped, and its
-- intermediate state is transferred to this job.
jReplaceJobId :: Lens' Job (Maybe Text)
jReplaceJobId
  = lens _jReplaceJobId
      (\ s a -> s{_jReplaceJobId = a})

-- | The timestamp when the job was initially created. Immutable and set by
-- the Cloud Dataflow service.
jCreateTime :: Lens' Job (Maybe Text)
jCreateTime
  = lens _jCreateTime (\ s a -> s{_jCreateTime = a})

instance FromJSON Job where
        parseJSON
          = withObject "Job"
              (\ o ->
                 Job' <$>
                   (o .:? "requestedState") <*> (o .:? "location") <*>
                     (o .:? "environment")
                     <*> (o .:? "clientRequestId")
                     <*> (o .:? "currentState")
                     <*> (o .:? "replacedByJobId")
                     <*> (o .:? "tempFiles" .!= mempty)
                     <*> (o .:? "steps" .!= mempty)
                     <*> (o .:? "executionInfo")
                     <*> (o .:? "name")
                     <*> (o .:? "transformNameMapping")
                     <*> (o .:? "id")
                     <*> (o .:? "labels")
                     <*> (o .:? "projectId")
                     <*> (o .:? "type")
                     <*> (o .:? "currentStateTime")
                     <*> (o .:? "replaceJobId")
                     <*> (o .:? "createTime"))

instance ToJSON Job where
        toJSON Job'{..}
          = object
              (catMaybes
                 [("requestedState" .=) <$> _jRequestedState,
                  ("location" .=) <$> _jLocation,
                  ("environment" .=) <$> _jEnvironment,
                  ("clientRequestId" .=) <$> _jClientRequestId,
                  ("currentState" .=) <$> _jCurrentState,
                  ("replacedByJobId" .=) <$> _jReplacedByJobId,
                  ("tempFiles" .=) <$> _jTempFiles,
                  ("steps" .=) <$> _jSteps,
                  ("executionInfo" .=) <$> _jExecutionInfo,
                  ("name" .=) <$> _jName,
                  ("transformNameMapping" .=) <$>
                    _jTransformNameMApping,
                  ("id" .=) <$> _jId, ("labels" .=) <$> _jLabels,
                  ("projectId" .=) <$> _jProjectId,
                  ("type" .=) <$> _jType,
                  ("currentStateTime" .=) <$> _jCurrentStateTime,
                  ("replaceJobId" .=) <$> _jReplaceJobId,
                  ("createTime" .=) <$> _jCreateTime])

-- | An instruction that reads records. Takes no inputs, produces one output.
--
-- /See:/ 'readInstruction' smart constructor.
newtype ReadInstruction = ReadInstruction'
    { _riSource :: Maybe Source
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ReadInstruction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'riSource'
readInstruction
    :: ReadInstruction
readInstruction =
    ReadInstruction'
    { _riSource = Nothing
    }

-- | The source to read from.
riSource :: Lens' ReadInstruction (Maybe Source)
riSource = lens _riSource (\ s a -> s{_riSource = a})

instance FromJSON ReadInstruction where
        parseJSON
          = withObject "ReadInstruction"
              (\ o -> ReadInstruction' <$> (o .:? "source"))

instance ToJSON ReadInstruction where
        toJSON ReadInstruction'{..}
          = object (catMaybes [("source" .=) <$> _riSource])

-- | A progress measurement of a WorkItem by a worker.
--
-- /See:/ 'approximateReportedProgress' smart constructor.
data ApproximateReportedProgress = ApproximateReportedProgress'
    { _arpFractionConsumed     :: !(Maybe (Textual Double))
    , _arpConsumedParallelism  :: !(Maybe ReportedParallelism)
    , _arpRemainingParallelism :: !(Maybe ReportedParallelism)
    , _arpPosition             :: !(Maybe Position)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ApproximateReportedProgress' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'arpFractionConsumed'
--
-- * 'arpConsumedParallelism'
--
-- * 'arpRemainingParallelism'
--
-- * 'arpPosition'
approximateReportedProgress
    :: ApproximateReportedProgress
approximateReportedProgress =
    ApproximateReportedProgress'
    { _arpFractionConsumed = Nothing
    , _arpConsumedParallelism = Nothing
    , _arpRemainingParallelism = Nothing
    , _arpPosition = Nothing
    }

-- | Completion as fraction of the input consumed, from 0.0 (beginning,
-- nothing consumed), to 1.0 (end of the input, entire input consumed).
arpFractionConsumed :: Lens' ApproximateReportedProgress (Maybe Double)
arpFractionConsumed
  = lens _arpFractionConsumed
      (\ s a -> s{_arpFractionConsumed = a})
      . mapping _Coerce

-- | Total amount of parallelism in the portion of input of this task that
-- has already been consumed and is no longer active. In the first two
-- examples above (see remaining_parallelism), the value should be 29 or 2
-- respectively. The sum of remaining_parallelism and consumed_parallelism
-- should equal the total amount of parallelism in this work item. If
-- specified, must be finite.
arpConsumedParallelism :: Lens' ApproximateReportedProgress (Maybe ReportedParallelism)
arpConsumedParallelism
  = lens _arpConsumedParallelism
      (\ s a -> s{_arpConsumedParallelism = a})

-- | Total amount of parallelism in the input of this task that remains,
-- (i.e. can be delegated to this task and any new tasks via dynamic
-- splitting). Always at least 1 for non-finished work items and 0 for
-- finished. \"Amount of parallelism\" refers to how many non-empty parts
-- of the input can be read in parallel. This does not necessarily equal
-- number of records. An input that can be read in parallel down to the
-- individual records is called \"perfectly splittable\". An example of
-- non-perfectly parallelizable input is a block-compressed file format
-- where a block of records has to be read as a whole, but different blocks
-- can be read in parallel. Examples: * If we are processing record #30
-- (starting at 1) out of 50 in a perfectly splittable 50-record input,
-- this value should be 21 (20 remaining + 1 current). * If we are reading
-- through block 3 in a block-compressed file consisting of 5 blocks, this
-- value should be 3 (since blocks 4 and 5 can be processed in parallel by
-- new tasks via dynamic splitting and the current task remains processing
-- block 3). * If we are reading through the last block in a
-- block-compressed file, or reading or processing the last record in a
-- perfectly splittable input, this value should be 1, because apart from
-- the current task, no additional remainder can be split off.
arpRemainingParallelism :: Lens' ApproximateReportedProgress (Maybe ReportedParallelism)
arpRemainingParallelism
  = lens _arpRemainingParallelism
      (\ s a -> s{_arpRemainingParallelism = a})

-- | A Position within the work to represent a progress.
arpPosition :: Lens' ApproximateReportedProgress (Maybe Position)
arpPosition
  = lens _arpPosition (\ s a -> s{_arpPosition = a})

instance FromJSON ApproximateReportedProgress where
        parseJSON
          = withObject "ApproximateReportedProgress"
              (\ o ->
                 ApproximateReportedProgress' <$>
                   (o .:? "fractionConsumed") <*>
                     (o .:? "consumedParallelism")
                     <*> (o .:? "remainingParallelism")
                     <*> (o .:? "position"))

instance ToJSON ApproximateReportedProgress where
        toJSON ApproximateReportedProgress'{..}
          = object
              (catMaybes
                 [("fractionConsumed" .=) <$> _arpFractionConsumed,
                  ("consumedParallelism" .=) <$>
                    _arpConsumedParallelism,
                  ("remainingParallelism" .=) <$>
                    _arpRemainingParallelism,
                  ("position" .=) <$> _arpPosition])

-- | The sink to write to, plus its parameters.
--
-- /See:/ 'sinkSpec' smart constructor.
newtype SinkSpec = SinkSpec'
    { _sAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SinkSpec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sAddtional'
sinkSpec
    :: HashMap Text JSONValue -- ^ 'sAddtional'
    -> SinkSpec
sinkSpec pSAddtional_ =
    SinkSpec'
    { _sAddtional = _Coerce # pSAddtional_
    }

-- | Properties of the object.
sAddtional :: Lens' SinkSpec (HashMap Text JSONValue)
sAddtional
  = lens _sAddtional (\ s a -> s{_sAddtional = a}) .
      _Coerce

instance FromJSON SinkSpec where
        parseJSON
          = withObject "SinkSpec"
              (\ o -> SinkSpec' <$> (parseJSONObject o))

instance ToJSON SinkSpec where
        toJSON = toJSON . _sAddtional

-- | Describes one particular pool of Cloud Dataflow workers to be
-- instantiated by the Cloud Dataflow service in order to perform the
-- computations required by a job. Note that a workflow job may use
-- multiple pools, in order to match the various computational requirements
-- of the various stages of the job.
--
-- /See:/ 'workerPool' smart constructor.
data WorkerPool = WorkerPool'
    { _wpAutoscalingSettings         :: !(Maybe AutoscalingSettings)
    , _wpNumThreadsPerWorker         :: !(Maybe (Textual Int32))
    , _wpDiskSizeGb                  :: !(Maybe (Textual Int32))
    , _wpKind                        :: !(Maybe Text)
    , _wpTaskrunnerSettings          :: !(Maybe TaskRunnerSettings)
    , _wpNumWorkers                  :: !(Maybe (Textual Int32))
    , _wpNetwork                     :: !(Maybe Text)
    , _wpZone                        :: !(Maybe Text)
    , _wpIPConfiguration             :: !(Maybe Text)
    , _wpPackages                    :: !(Maybe [Package])
    , _wpOnHostMaintenance           :: !(Maybe Text)
    , _wpDiskSourceImage             :: !(Maybe Text)
    , _wpSubnetwork                  :: !(Maybe Text)
    , _wpMachineType                 :: !(Maybe Text)
    , _wpMetadata                    :: !(Maybe WorkerPoolMetadata)
    , _wpDiskType                    :: !(Maybe Text)
    , _wpTeardownPolicy              :: !(Maybe Text)
    , _wpDefaultPackageSet           :: !(Maybe Text)
    , _wpPoolArgs                    :: !(Maybe WorkerPoolPoolArgs)
    , _wpWorkerHarnessContainerImage :: !(Maybe Text)
    , _wpDataDisks                   :: !(Maybe [Disk])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerPool' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wpAutoscalingSettings'
--
-- * 'wpNumThreadsPerWorker'
--
-- * 'wpDiskSizeGb'
--
-- * 'wpKind'
--
-- * 'wpTaskrunnerSettings'
--
-- * 'wpNumWorkers'
--
-- * 'wpNetwork'
--
-- * 'wpZone'
--
-- * 'wpIPConfiguration'
--
-- * 'wpPackages'
--
-- * 'wpOnHostMaintenance'
--
-- * 'wpDiskSourceImage'
--
-- * 'wpSubnetwork'
--
-- * 'wpMachineType'
--
-- * 'wpMetadata'
--
-- * 'wpDiskType'
--
-- * 'wpTeardownPolicy'
--
-- * 'wpDefaultPackageSet'
--
-- * 'wpPoolArgs'
--
-- * 'wpWorkerHarnessContainerImage'
--
-- * 'wpDataDisks'
workerPool
    :: WorkerPool
workerPool =
    WorkerPool'
    { _wpAutoscalingSettings = Nothing
    , _wpNumThreadsPerWorker = Nothing
    , _wpDiskSizeGb = Nothing
    , _wpKind = Nothing
    , _wpTaskrunnerSettings = Nothing
    , _wpNumWorkers = Nothing
    , _wpNetwork = Nothing
    , _wpZone = Nothing
    , _wpIPConfiguration = Nothing
    , _wpPackages = Nothing
    , _wpOnHostMaintenance = Nothing
    , _wpDiskSourceImage = Nothing
    , _wpSubnetwork = Nothing
    , _wpMachineType = Nothing
    , _wpMetadata = Nothing
    , _wpDiskType = Nothing
    , _wpTeardownPolicy = Nothing
    , _wpDefaultPackageSet = Nothing
    , _wpPoolArgs = Nothing
    , _wpWorkerHarnessContainerImage = Nothing
    , _wpDataDisks = Nothing
    }

-- | Settings for autoscaling of this WorkerPool.
wpAutoscalingSettings :: Lens' WorkerPool (Maybe AutoscalingSettings)
wpAutoscalingSettings
  = lens _wpAutoscalingSettings
      (\ s a -> s{_wpAutoscalingSettings = a})

-- | The number of threads per worker harness. If empty or unspecified, the
-- service will choose a number of threads (according to the number of
-- cores on the selected machine type for batch, or 1 by convention for
-- streaming).
wpNumThreadsPerWorker :: Lens' WorkerPool (Maybe Int32)
wpNumThreadsPerWorker
  = lens _wpNumThreadsPerWorker
      (\ s a -> s{_wpNumThreadsPerWorker = a})
      . mapping _Coerce

-- | Size of root disk for VMs, in GB. If zero or unspecified, the service
-- will attempt to choose a reasonable default.
wpDiskSizeGb :: Lens' WorkerPool (Maybe Int32)
wpDiskSizeGb
  = lens _wpDiskSizeGb (\ s a -> s{_wpDiskSizeGb = a})
      . mapping _Coerce

-- | The kind of the worker pool; currently only \`harness\` and \`shuffle\`
-- are supported.
wpKind :: Lens' WorkerPool (Maybe Text)
wpKind = lens _wpKind (\ s a -> s{_wpKind = a})

-- | Settings passed through to Google Compute Engine workers when using the
-- standard Dataflow task runner. Users should ignore this field.
wpTaskrunnerSettings :: Lens' WorkerPool (Maybe TaskRunnerSettings)
wpTaskrunnerSettings
  = lens _wpTaskrunnerSettings
      (\ s a -> s{_wpTaskrunnerSettings = a})

-- | Number of Google Compute Engine workers in this pool needed to execute
-- the job. If zero or unspecified, the service will attempt to choose a
-- reasonable default.
wpNumWorkers :: Lens' WorkerPool (Maybe Int32)
wpNumWorkers
  = lens _wpNumWorkers (\ s a -> s{_wpNumWorkers = a})
      . mapping _Coerce

-- | Network to which VMs will be assigned. If empty or unspecified, the
-- service will use the network \"default\".
wpNetwork :: Lens' WorkerPool (Maybe Text)
wpNetwork
  = lens _wpNetwork (\ s a -> s{_wpNetwork = a})

-- | Zone to run the worker pools in. If empty or unspecified, the service
-- will attempt to choose a reasonable default.
wpZone :: Lens' WorkerPool (Maybe Text)
wpZone = lens _wpZone (\ s a -> s{_wpZone = a})

-- | Configuration for VM IPs.
wpIPConfiguration :: Lens' WorkerPool (Maybe Text)
wpIPConfiguration
  = lens _wpIPConfiguration
      (\ s a -> s{_wpIPConfiguration = a})

-- | Packages to be installed on workers.
wpPackages :: Lens' WorkerPool [Package]
wpPackages
  = lens _wpPackages (\ s a -> s{_wpPackages = a}) .
      _Default
      . _Coerce

-- | The action to take on host maintenance, as defined by the Google Compute
-- Engine API.
wpOnHostMaintenance :: Lens' WorkerPool (Maybe Text)
wpOnHostMaintenance
  = lens _wpOnHostMaintenance
      (\ s a -> s{_wpOnHostMaintenance = a})

-- | Fully qualified source image for disks.
wpDiskSourceImage :: Lens' WorkerPool (Maybe Text)
wpDiskSourceImage
  = lens _wpDiskSourceImage
      (\ s a -> s{_wpDiskSourceImage = a})

-- | Subnetwork to which VMs will be assigned, if desired. Expected to be of
-- the form \"regions\/REGION\/subnetworks\/SUBNETWORK\".
wpSubnetwork :: Lens' WorkerPool (Maybe Text)
wpSubnetwork
  = lens _wpSubnetwork (\ s a -> s{_wpSubnetwork = a})

-- | Machine type (e.g. \"n1-standard-1\"). If empty or unspecified, the
-- service will attempt to choose a reasonable default.
wpMachineType :: Lens' WorkerPool (Maybe Text)
wpMachineType
  = lens _wpMachineType
      (\ s a -> s{_wpMachineType = a})

-- | Metadata to set on the Google Compute Engine VMs.
wpMetadata :: Lens' WorkerPool (Maybe WorkerPoolMetadata)
wpMetadata
  = lens _wpMetadata (\ s a -> s{_wpMetadata = a})

-- | Type of root disk for VMs. If empty or unspecified, the service will
-- attempt to choose a reasonable default.
wpDiskType :: Lens' WorkerPool (Maybe Text)
wpDiskType
  = lens _wpDiskType (\ s a -> s{_wpDiskType = a})

-- | Sets the policy for determining when to turndown worker pool. Allowed
-- values are: \`TEARDOWN_ALWAYS\`, \`TEARDOWN_ON_SUCCESS\`, and
-- \`TEARDOWN_NEVER\`. \`TEARDOWN_ALWAYS\` means workers are always torn
-- down regardless of whether the job succeeds. \`TEARDOWN_ON_SUCCESS\`
-- means workers are torn down if the job succeeds. \`TEARDOWN_NEVER\`
-- means the workers are never torn down. If the workers are not torn down
-- by the service, they will continue to run and use Google Compute Engine
-- VM resources in the user\'s project until they are explicitly terminated
-- by the user. Because of this, Google recommends using the
-- \`TEARDOWN_ALWAYS\` policy except for small, manually supervised test
-- jobs. If unknown or unspecified, the service will attempt to choose a
-- reasonable default.
wpTeardownPolicy :: Lens' WorkerPool (Maybe Text)
wpTeardownPolicy
  = lens _wpTeardownPolicy
      (\ s a -> s{_wpTeardownPolicy = a})

-- | The default package set to install. This allows the service to select a
-- default set of packages which are useful to worker harnesses written in
-- a particular language.
wpDefaultPackageSet :: Lens' WorkerPool (Maybe Text)
wpDefaultPackageSet
  = lens _wpDefaultPackageSet
      (\ s a -> s{_wpDefaultPackageSet = a})

-- | Extra arguments for this worker pool.
wpPoolArgs :: Lens' WorkerPool (Maybe WorkerPoolPoolArgs)
wpPoolArgs
  = lens _wpPoolArgs (\ s a -> s{_wpPoolArgs = a})

-- | Required. Docker container image that executes the Cloud Dataflow worker
-- harness, residing in Google Container Registry.
wpWorkerHarnessContainerImage :: Lens' WorkerPool (Maybe Text)
wpWorkerHarnessContainerImage
  = lens _wpWorkerHarnessContainerImage
      (\ s a -> s{_wpWorkerHarnessContainerImage = a})

-- | Data disks that are used by a VM in this workflow.
wpDataDisks :: Lens' WorkerPool [Disk]
wpDataDisks
  = lens _wpDataDisks (\ s a -> s{_wpDataDisks = a}) .
      _Default
      . _Coerce

instance FromJSON WorkerPool where
        parseJSON
          = withObject "WorkerPool"
              (\ o ->
                 WorkerPool' <$>
                   (o .:? "autoscalingSettings") <*>
                     (o .:? "numThreadsPerWorker")
                     <*> (o .:? "diskSizeGb")
                     <*> (o .:? "kind")
                     <*> (o .:? "taskrunnerSettings")
                     <*> (o .:? "numWorkers")
                     <*> (o .:? "network")
                     <*> (o .:? "zone")
                     <*> (o .:? "ipConfiguration")
                     <*> (o .:? "packages" .!= mempty)
                     <*> (o .:? "onHostMaintenance")
                     <*> (o .:? "diskSourceImage")
                     <*> (o .:? "subnetwork")
                     <*> (o .:? "machineType")
                     <*> (o .:? "metadata")
                     <*> (o .:? "diskType")
                     <*> (o .:? "teardownPolicy")
                     <*> (o .:? "defaultPackageSet")
                     <*> (o .:? "poolArgs")
                     <*> (o .:? "workerHarnessContainerImage")
                     <*> (o .:? "dataDisks" .!= mempty))

instance ToJSON WorkerPool where
        toJSON WorkerPool'{..}
          = object
              (catMaybes
                 [("autoscalingSettings" .=) <$>
                    _wpAutoscalingSettings,
                  ("numThreadsPerWorker" .=) <$>
                    _wpNumThreadsPerWorker,
                  ("diskSizeGb" .=) <$> _wpDiskSizeGb,
                  ("kind" .=) <$> _wpKind,
                  ("taskrunnerSettings" .=) <$> _wpTaskrunnerSettings,
                  ("numWorkers" .=) <$> _wpNumWorkers,
                  ("network" .=) <$> _wpNetwork,
                  ("zone" .=) <$> _wpZone,
                  ("ipConfiguration" .=) <$> _wpIPConfiguration,
                  ("packages" .=) <$> _wpPackages,
                  ("onHostMaintenance" .=) <$> _wpOnHostMaintenance,
                  ("diskSourceImage" .=) <$> _wpDiskSourceImage,
                  ("subnetwork" .=) <$> _wpSubnetwork,
                  ("machineType" .=) <$> _wpMachineType,
                  ("metadata" .=) <$> _wpMetadata,
                  ("diskType" .=) <$> _wpDiskType,
                  ("teardownPolicy" .=) <$> _wpTeardownPolicy,
                  ("defaultPackageSet" .=) <$> _wpDefaultPackageSet,
                  ("poolArgs" .=) <$> _wpPoolArgs,
                  ("workerHarnessContainerImage" .=) <$>
                    _wpWorkerHarnessContainerImage,
                  ("dataDisks" .=) <$> _wpDataDisks])

-- | Defines a particular step within a Cloud Dataflow job. A job consists of
-- multiple steps, each of which performs some specific operation as part
-- of the overall job. Data is typically passed from one step to another as
-- part of the job. Here\'s an example of a sequence of steps which
-- together implement a Map-Reduce job: * Read a collection of data from
-- some source, parsing the collection\'s elements. * Validate the
-- elements. * Apply a user-defined function to map each element to some
-- value and extract an element-specific key value. * Group elements with
-- the same key into a single element with that key, transforming a
-- multiply-keyed collection into a uniquely-keyed collection. * Write the
-- elements out to some data sink. Note that the Cloud Dataflow service may
-- be used to run many different types of jobs, not just Map-Reduce.
--
-- /See:/ 'step' smart constructor.
data Step = Step'
    { _sKind       :: !(Maybe Text)
    , _sName       :: !(Maybe Text)
    , _sProperties :: !(Maybe StepProperties)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Step' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sKind'
--
-- * 'sName'
--
-- * 'sProperties'
step
    :: Step
step =
    Step'
    { _sKind = Nothing
    , _sName = Nothing
    , _sProperties = Nothing
    }

-- | The kind of step in the Cloud Dataflow job.
sKind :: Lens' Step (Maybe Text)
sKind = lens _sKind (\ s a -> s{_sKind = a})

-- | The name that identifies the step. This must be unique for each step
-- with respect to all other steps in the Cloud Dataflow job.
sName :: Lens' Step (Maybe Text)
sName = lens _sName (\ s a -> s{_sName = a})

-- | Named properties associated with the step. Each kind of predefined step
-- has its own required set of properties.
sProperties :: Lens' Step (Maybe StepProperties)
sProperties
  = lens _sProperties (\ s a -> s{_sProperties = a})

instance FromJSON Step where
        parseJSON
          = withObject "Step"
              (\ o ->
                 Step' <$>
                   (o .:? "kind") <*> (o .:? "name") <*>
                     (o .:? "properties"))

instance ToJSON Step where
        toJSON Step'{..}
          = object
              (catMaybes
                 [("kind" .=) <$> _sKind, ("name" .=) <$> _sName,
                  ("properties" .=) <$> _sProperties])

-- | The packages that must be installed in order for a worker to run the
-- steps of the Cloud Dataflow job that will be assigned to its worker
-- pool. This is the mechanism by which the Cloud Dataflow SDK causes code
-- to be loaded onto the workers. For example, the Cloud Dataflow Java SDK
-- might use this to install jars containing the user\'s code and all of
-- the various dependencies (libraries, data files, etc.) required in order
-- for that code to run.
--
-- /See:/ 'package' smart constructor.
data Package = Package'
    { _pLocation :: !(Maybe Text)
    , _pName     :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Package' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pLocation'
--
-- * 'pName'
package
    :: Package
package =
    Package'
    { _pLocation = Nothing
    , _pName = Nothing
    }

-- | The resource to read the package from. The supported resource type is:
-- Google Cloud Storage: storage.googleapis.com\/{bucket}
-- bucket.storage.googleapis.com\/
pLocation :: Lens' Package (Maybe Text)
pLocation
  = lens _pLocation (\ s a -> s{_pLocation = a})

-- | The name of the package.
pName :: Lens' Package (Maybe Text)
pName = lens _pName (\ s a -> s{_pName = a})

instance FromJSON Package where
        parseJSON
          = withObject "Package"
              (\ o ->
                 Package' <$> (o .:? "location") <*> (o .:? "name"))

instance ToJSON Package where
        toJSON Package'{..}
          = object
              (catMaybes
                 [("location" .=) <$> _pLocation,
                  ("name" .=) <$> _pName])

-- | Parameters contains specific information about the code. This is a
-- struct to allow parameters of different types. Examples: 1. For a
-- \"HARNESS_STARTED\" message parameters might provide the name of the
-- worker and additional data like timing information. 2. For a
-- \"GCS_DOWNLOAD_ERROR\" parameters might contain fields listing the GCS
-- objects being downloaded and fields containing errors. In general
-- complex data structures should be avoided. If a worker needs to send a
-- specific and complicated data structure then please consider defining a
-- new proto and adding it to the data oneof in WorkerMessageResponse.
-- Conventions: Parameters should only be used for information that isn\'t
-- typically passed as a label. hostname and other worker identifiers
-- should almost always be passed as labels since they will be included on
-- most messages.
--
-- /See:/ 'workerMessageCodeParameters' smart constructor.
newtype WorkerMessageCodeParameters = WorkerMessageCodeParameters'
    { _wmcpAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerMessageCodeParameters' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wmcpAddtional'
workerMessageCodeParameters
    :: HashMap Text JSONValue -- ^ 'wmcpAddtional'
    -> WorkerMessageCodeParameters
workerMessageCodeParameters pWmcpAddtional_ =
    WorkerMessageCodeParameters'
    { _wmcpAddtional = _Coerce # pWmcpAddtional_
    }

-- | Properties of the object.
wmcpAddtional :: Lens' WorkerMessageCodeParameters (HashMap Text JSONValue)
wmcpAddtional
  = lens _wmcpAddtional
      (\ s a -> s{_wmcpAddtional = a})
      . _Coerce

instance FromJSON WorkerMessageCodeParameters where
        parseJSON
          = withObject "WorkerMessageCodeParameters"
              (\ o ->
                 WorkerMessageCodeParameters' <$> (parseJSONObject o))

instance ToJSON WorkerMessageCodeParameters where
        toJSON = toJSON . _wmcpAddtional

-- | When a task splits using WorkItemStatus.dynamic_source_split, this
-- message describes the two parts of the split relative to the description
-- of the current task\'s input.
--
-- /See:/ 'dynamicSourceSplit' smart constructor.
data DynamicSourceSplit = DynamicSourceSplit'
    { _dssResidual :: !(Maybe DerivedSource)
    , _dssPrimary  :: !(Maybe DerivedSource)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DynamicSourceSplit' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'dssResidual'
--
-- * 'dssPrimary'
dynamicSourceSplit
    :: DynamicSourceSplit
dynamicSourceSplit =
    DynamicSourceSplit'
    { _dssResidual = Nothing
    , _dssPrimary = Nothing
    }

-- | Residual part (returned to the pool of work). Specified relative to the
-- previously-current source.
dssResidual :: Lens' DynamicSourceSplit (Maybe DerivedSource)
dssResidual
  = lens _dssResidual (\ s a -> s{_dssResidual = a})

-- | Primary part (continued to be processed by worker). Specified relative
-- to the previously-current source. Becomes current.
dssPrimary :: Lens' DynamicSourceSplit (Maybe DerivedSource)
dssPrimary
  = lens _dssPrimary (\ s a -> s{_dssPrimary = a})

instance FromJSON DynamicSourceSplit where
        parseJSON
          = withObject "DynamicSourceSplit"
              (\ o ->
                 DynamicSourceSplit' <$>
                   (o .:? "residual") <*> (o .:? "primary"))

instance ToJSON DynamicSourceSplit where
        toJSON DynamicSourceSplit'{..}
          = object
              (catMaybes
                 [("residual" .=) <$> _dssResidual,
                  ("primary" .=) <$> _dssPrimary])

-- | Response from a request to report the status of WorkItems.
--
-- /See:/ 'reportWorkItemStatusResponse' smart constructor.
newtype ReportWorkItemStatusResponse = ReportWorkItemStatusResponse'
    { _rwisrWorkItemServiceStates :: Maybe [WorkItemServiceState]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ReportWorkItemStatusResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'rwisrWorkItemServiceStates'
reportWorkItemStatusResponse
    :: ReportWorkItemStatusResponse
reportWorkItemStatusResponse =
    ReportWorkItemStatusResponse'
    { _rwisrWorkItemServiceStates = Nothing
    }

-- | A set of messages indicating the service-side state for each WorkItem
-- whose status was reported, in the same order as the WorkItemStatus
-- messages in the ReportWorkItemStatusRequest which resulting in this
-- response.
rwisrWorkItemServiceStates :: Lens' ReportWorkItemStatusResponse [WorkItemServiceState]
rwisrWorkItemServiceStates
  = lens _rwisrWorkItemServiceStates
      (\ s a -> s{_rwisrWorkItemServiceStates = a})
      . _Default
      . _Coerce

instance FromJSON ReportWorkItemStatusResponse where
        parseJSON
          = withObject "ReportWorkItemStatusResponse"
              (\ o ->
                 ReportWorkItemStatusResponse' <$>
                   (o .:? "workItemServiceStates" .!= mempty))

instance ToJSON ReportWorkItemStatusResponse where
        toJSON ReportWorkItemStatusResponse'{..}
          = object
              (catMaybes
                 [("workItemServiceStates" .=) <$>
                    _rwisrWorkItemServiceStates])

-- | DEPRECATED in favor of DynamicSourceSplit.
--
-- /See:/ 'sourceFork' smart constructor.
data SourceFork = SourceFork'
    { _sfResidual       :: !(Maybe SourceSplitShard)
    , _sfPrimarySource  :: !(Maybe DerivedSource)
    , _sfPrimary        :: !(Maybe SourceSplitShard)
    , _sfResidualSource :: !(Maybe DerivedSource)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceFork' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sfResidual'
--
-- * 'sfPrimarySource'
--
-- * 'sfPrimary'
--
-- * 'sfResidualSource'
sourceFork
    :: SourceFork
sourceFork =
    SourceFork'
    { _sfResidual = Nothing
    , _sfPrimarySource = Nothing
    , _sfPrimary = Nothing
    , _sfResidualSource = Nothing
    }

-- | DEPRECATED
sfResidual :: Lens' SourceFork (Maybe SourceSplitShard)
sfResidual
  = lens _sfResidual (\ s a -> s{_sfResidual = a})

-- | DEPRECATED
sfPrimarySource :: Lens' SourceFork (Maybe DerivedSource)
sfPrimarySource
  = lens _sfPrimarySource
      (\ s a -> s{_sfPrimarySource = a})

-- | DEPRECATED
sfPrimary :: Lens' SourceFork (Maybe SourceSplitShard)
sfPrimary
  = lens _sfPrimary (\ s a -> s{_sfPrimary = a})

-- | DEPRECATED
sfResidualSource :: Lens' SourceFork (Maybe DerivedSource)
sfResidualSource
  = lens _sfResidualSource
      (\ s a -> s{_sfResidualSource = a})

instance FromJSON SourceFork where
        parseJSON
          = withObject "SourceFork"
              (\ o ->
                 SourceFork' <$>
                   (o .:? "residual") <*> (o .:? "primarySource") <*>
                     (o .:? "primary")
                     <*> (o .:? "residualSource"))

instance ToJSON SourceFork where
        toJSON SourceFork'{..}
          = object
              (catMaybes
                 [("residual" .=) <$> _sfResidual,
                  ("primarySource" .=) <$> _sfPrimarySource,
                  ("primary" .=) <$> _sfPrimary,
                  ("residualSource" .=) <$> _sfResidualSource])

-- | Service-side response to WorkerMessage reporting resource utilization.
--
-- /See:/ 'resourceUtilizationReportResponse' smart constructor.
data ResourceUtilizationReportResponse =
    ResourceUtilizationReportResponse'
    deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ResourceUtilizationReportResponse' with the minimum fields required to make a request.
--
resourceUtilizationReportResponse
    :: ResourceUtilizationReportResponse
resourceUtilizationReportResponse = ResourceUtilizationReportResponse'

instance FromJSON ResourceUtilizationReportResponse
         where
        parseJSON
          = withObject "ResourceUtilizationReportResponse"
              (\ o -> pure ResourceUtilizationReportResponse')

instance ToJSON ResourceUtilizationReportResponse
         where
        toJSON = const emptyObject

-- | Describes full or partial data disk assignment information of the
-- computation ranges.
--
-- /See:/ 'streamingComputationRanges' smart constructor.
data StreamingComputationRanges = StreamingComputationRanges'
    { _scrRangeAssignments :: !(Maybe [KeyRangeDataDiskAssignment])
    , _scrComputationId    :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingComputationRanges' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'scrRangeAssignments'
--
-- * 'scrComputationId'
streamingComputationRanges
    :: StreamingComputationRanges
streamingComputationRanges =
    StreamingComputationRanges'
    { _scrRangeAssignments = Nothing
    , _scrComputationId = Nothing
    }

-- | Data disk assignments for ranges from this computation.
scrRangeAssignments :: Lens' StreamingComputationRanges [KeyRangeDataDiskAssignment]
scrRangeAssignments
  = lens _scrRangeAssignments
      (\ s a -> s{_scrRangeAssignments = a})
      . _Default
      . _Coerce

-- | The ID of the computation.
scrComputationId :: Lens' StreamingComputationRanges (Maybe Text)
scrComputationId
  = lens _scrComputationId
      (\ s a -> s{_scrComputationId = a})

instance FromJSON StreamingComputationRanges where
        parseJSON
          = withObject "StreamingComputationRanges"
              (\ o ->
                 StreamingComputationRanges' <$>
                   (o .:? "rangeAssignments" .!= mempty) <*>
                     (o .:? "computationId"))

instance ToJSON StreamingComputationRanges where
        toJSON StreamingComputationRanges'{..}
          = object
              (catMaybes
                 [("rangeAssignments" .=) <$> _scrRangeAssignments,
                  ("computationId" .=) <$> _scrComputationId])

-- | Response to a request to list Cloud Dataflow jobs. This may be a partial
-- response, depending on the page size in the ListJobsRequest.
--
-- /See:/ 'listJobsResponse' smart constructor.
data ListJobsResponse = ListJobsResponse'
    { _ljrNextPageToken  :: !(Maybe Text)
    , _ljrFailedLocation :: !(Maybe [FailedLocation])
    , _ljrJobs           :: !(Maybe [Job])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListJobsResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ljrNextPageToken'
--
-- * 'ljrFailedLocation'
--
-- * 'ljrJobs'
listJobsResponse
    :: ListJobsResponse
listJobsResponse =
    ListJobsResponse'
    { _ljrNextPageToken = Nothing
    , _ljrFailedLocation = Nothing
    , _ljrJobs = Nothing
    }

-- | Set if there may be more results than fit in this response.
ljrNextPageToken :: Lens' ListJobsResponse (Maybe Text)
ljrNextPageToken
  = lens _ljrNextPageToken
      (\ s a -> s{_ljrNextPageToken = a})

-- | Zero or more messages describing locations that failed to respond.
ljrFailedLocation :: Lens' ListJobsResponse [FailedLocation]
ljrFailedLocation
  = lens _ljrFailedLocation
      (\ s a -> s{_ljrFailedLocation = a})
      . _Default
      . _Coerce

-- | A subset of the requested job information.
ljrJobs :: Lens' ListJobsResponse [Job]
ljrJobs
  = lens _ljrJobs (\ s a -> s{_ljrJobs = a}) . _Default
      . _Coerce

instance FromJSON ListJobsResponse where
        parseJSON
          = withObject "ListJobsResponse"
              (\ o ->
                 ListJobsResponse' <$>
                   (o .:? "nextPageToken") <*>
                     (o .:? "failedLocation" .!= mempty)
                     <*> (o .:? "jobs" .!= mempty))

instance ToJSON ListJobsResponse where
        toJSON ListJobsResponse'{..}
          = object
              (catMaybes
                 [("nextPageToken" .=) <$> _ljrNextPageToken,
                  ("failedLocation" .=) <$> _ljrFailedLocation,
                  ("jobs" .=) <$> _ljrJobs])

-- | A source that records can be read and decoded from.
--
-- /See:/ 'source' smart constructor.
data Source = Source'
    { _souDoesNotNeedSplitting :: !(Maybe Bool)
    , _souBaseSpecs            :: !(Maybe [SourceBaseSpecsItem])
    , _souCodec                :: !(Maybe SourceCodec)
    , _souSpec                 :: !(Maybe SourceSpec)
    , _souMetadata             :: !(Maybe SourceMetadata)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Source' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'souDoesNotNeedSplitting'
--
-- * 'souBaseSpecs'
--
-- * 'souCodec'
--
-- * 'souSpec'
--
-- * 'souMetadata'
source
    :: Source
source =
    Source'
    { _souDoesNotNeedSplitting = Nothing
    , _souBaseSpecs = Nothing
    , _souCodec = Nothing
    , _souSpec = Nothing
    , _souMetadata = Nothing
    }

-- | Setting this value to true hints to the framework that the source
-- doesn\'t need splitting, and using SourceSplitRequest on it would yield
-- SOURCE_SPLIT_OUTCOME_USE_CURRENT. E.g. a file splitter may set this to
-- true when splitting a single file into a set of byte ranges of
-- appropriate size, and set this to false when splitting a filepattern
-- into individual files. However, for efficiency, a file splitter may
-- decide to produce file subranges directly from the filepattern to avoid
-- a splitting round-trip. See SourceSplitRequest for an overview of the
-- splitting process. This field is meaningful only in the Source objects
-- populated by the user (e.g. when filling in a DerivedSource). Source
-- objects supplied by the framework to the user don\'t have this field
-- populated.
souDoesNotNeedSplitting :: Lens' Source (Maybe Bool)
souDoesNotNeedSplitting
  = lens _souDoesNotNeedSplitting
      (\ s a -> s{_souDoesNotNeedSplitting = a})

-- | While splitting, sources may specify the produced bundles as differences
-- against another source, in order to save backend-side memory and allow
-- bigger jobs. For details, see SourceSplitRequest. To support this use
-- case, the full set of parameters of the source is logically obtained by
-- taking the latest explicitly specified value of each parameter in the
-- order: base_specs (later items win), spec (overrides anything in
-- base_specs).
souBaseSpecs :: Lens' Source [SourceBaseSpecsItem]
souBaseSpecs
  = lens _souBaseSpecs (\ s a -> s{_souBaseSpecs = a})
      . _Default
      . _Coerce

-- | The codec to use to decode data read from the source.
souCodec :: Lens' Source (Maybe SourceCodec)
souCodec = lens _souCodec (\ s a -> s{_souCodec = a})

-- | The source to read from, plus its parameters.
souSpec :: Lens' Source (Maybe SourceSpec)
souSpec = lens _souSpec (\ s a -> s{_souSpec = a})

-- | Optionally, metadata for this source can be supplied right away,
-- avoiding a SourceGetMetadataOperation roundtrip (see
-- SourceOperationRequest). This field is meaningful only in the Source
-- objects populated by the user (e.g. when filling in a DerivedSource).
-- Source objects supplied by the framework to the user don\'t have this
-- field populated.
souMetadata :: Lens' Source (Maybe SourceMetadata)
souMetadata
  = lens _souMetadata (\ s a -> s{_souMetadata = a})

instance FromJSON Source where
        parseJSON
          = withObject "Source"
              (\ o ->
                 Source' <$>
                   (o .:? "doesNotNeedSplitting") <*>
                     (o .:? "baseSpecs" .!= mempty)
                     <*> (o .:? "codec")
                     <*> (o .:? "spec")
                     <*> (o .:? "metadata"))

instance ToJSON Source where
        toJSON Source'{..}
          = object
              (catMaybes
                 [("doesNotNeedSplitting" .=) <$>
                    _souDoesNotNeedSplitting,
                  ("baseSpecs" .=) <$> _souBaseSpecs,
                  ("codec" .=) <$> _souCodec, ("spec" .=) <$> _souSpec,
                  ("metadata" .=) <$> _souMetadata])

-- | Obsolete in favor of ApproximateReportedProgress and
-- ApproximateSplitRequest.
--
-- /See:/ 'approximateProgress' smart constructor.
data ApproximateProgress = ApproximateProgress'
    { _apRemainingTime   :: !(Maybe Text)
    , _apPercentComplete :: !(Maybe (Textual Double))
    , _apPosition        :: !(Maybe Position)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ApproximateProgress' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'apRemainingTime'
--
-- * 'apPercentComplete'
--
-- * 'apPosition'
approximateProgress
    :: ApproximateProgress
approximateProgress =
    ApproximateProgress'
    { _apRemainingTime = Nothing
    , _apPercentComplete = Nothing
    , _apPosition = Nothing
    }

-- | Obsolete.
apRemainingTime :: Lens' ApproximateProgress (Maybe Text)
apRemainingTime
  = lens _apRemainingTime
      (\ s a -> s{_apRemainingTime = a})

-- | Obsolete.
apPercentComplete :: Lens' ApproximateProgress (Maybe Double)
apPercentComplete
  = lens _apPercentComplete
      (\ s a -> s{_apPercentComplete = a})
      . mapping _Coerce

-- | Obsolete.
apPosition :: Lens' ApproximateProgress (Maybe Position)
apPosition
  = lens _apPosition (\ s a -> s{_apPosition = a})

instance FromJSON ApproximateProgress where
        parseJSON
          = withObject "ApproximateProgress"
              (\ o ->
                 ApproximateProgress' <$>
                   (o .:? "remainingTime") <*> (o .:? "percentComplete")
                     <*> (o .:? "position"))

instance ToJSON ApproximateProgress where
        toJSON ApproximateProgress'{..}
          = object
              (catMaybes
                 [("remainingTime" .=) <$> _apRemainingTime,
                  ("percentComplete" .=) <$> _apPercentComplete,
                  ("position" .=) <$> _apPosition])

-- | WorkerMessage provides information to the backend about a worker.
--
-- /See:/ 'workerMessage' smart constructor.
data WorkerMessage = WorkerMessage'
    { _wmWorkerHealthReport :: !(Maybe WorkerHealthReport)
    , _wmTime               :: !(Maybe Text)
    , _wmWorkerMessageCode  :: !(Maybe WorkerMessageCode)
    , _wmWorkerMetrics      :: !(Maybe ResourceUtilizationReport)
    , _wmLabels             :: !(Maybe WorkerMessageLabels)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'WorkerMessage' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'wmWorkerHealthReport'
--
-- * 'wmTime'
--
-- * 'wmWorkerMessageCode'
--
-- * 'wmWorkerMetrics'
--
-- * 'wmLabels'
workerMessage
    :: WorkerMessage
workerMessage =
    WorkerMessage'
    { _wmWorkerHealthReport = Nothing
    , _wmTime = Nothing
    , _wmWorkerMessageCode = Nothing
    , _wmWorkerMetrics = Nothing
    , _wmLabels = Nothing
    }

-- | The health of a worker.
wmWorkerHealthReport :: Lens' WorkerMessage (Maybe WorkerHealthReport)
wmWorkerHealthReport
  = lens _wmWorkerHealthReport
      (\ s a -> s{_wmWorkerHealthReport = a})

-- | The timestamp of the worker_message.
wmTime :: Lens' WorkerMessage (Maybe Text)
wmTime = lens _wmTime (\ s a -> s{_wmTime = a})

-- | A worker message code.
wmWorkerMessageCode :: Lens' WorkerMessage (Maybe WorkerMessageCode)
wmWorkerMessageCode
  = lens _wmWorkerMessageCode
      (\ s a -> s{_wmWorkerMessageCode = a})

-- | Resource metrics reported by workers.
wmWorkerMetrics :: Lens' WorkerMessage (Maybe ResourceUtilizationReport)
wmWorkerMetrics
  = lens _wmWorkerMetrics
      (\ s a -> s{_wmWorkerMetrics = a})

-- | Labels are used to group WorkerMessages. For example, a worker_message
-- about a particular container might have the labels: { \"JOB_ID\":
-- \"2015-04-22\", \"WORKER_ID\": \"wordcount-vm-2015…\"
-- \"CONTAINER_TYPE\": \"worker\", \"CONTAINER_ID\": \"ac1234def\"} Label
-- tags typically correspond to Label enum values. However, for ease of
-- development other strings can be used as tags. LABEL_UNSPECIFIED should
-- not be used here.
wmLabels :: Lens' WorkerMessage (Maybe WorkerMessageLabels)
wmLabels = lens _wmLabels (\ s a -> s{_wmLabels = a})

instance FromJSON WorkerMessage where
        parseJSON
          = withObject "WorkerMessage"
              (\ o ->
                 WorkerMessage' <$>
                   (o .:? "workerHealthReport") <*> (o .:? "time") <*>
                     (o .:? "workerMessageCode")
                     <*> (o .:? "workerMetrics")
                     <*> (o .:? "labels"))

instance ToJSON WorkerMessage where
        toJSON WorkerMessage'{..}
          = object
              (catMaybes
                 [("workerHealthReport" .=) <$> _wmWorkerHealthReport,
                  ("time" .=) <$> _wmTime,
                  ("workerMessageCode" .=) <$> _wmWorkerMessageCode,
                  ("workerMetrics" .=) <$> _wmWorkerMetrics,
                  ("labels" .=) <$> _wmLabels])

-- | Location information for a specific key-range of a sharded computation.
-- Currently we only support UTF-8 character splits to simplify encoding
-- into JSON.
--
-- /See:/ 'keyRangeLocation' smart constructor.
data KeyRangeLocation = KeyRangeLocation'
    { _krlPersistentDirectory :: !(Maybe Text)
    , _krlDataDisk            :: !(Maybe Text)
    , _krlStart               :: !(Maybe Text)
    , _krlDeliveryEndpoint    :: !(Maybe Text)
    , _krlEnd                 :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'KeyRangeLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'krlPersistentDirectory'
--
-- * 'krlDataDisk'
--
-- * 'krlStart'
--
-- * 'krlDeliveryEndpoint'
--
-- * 'krlEnd'
keyRangeLocation
    :: KeyRangeLocation
keyRangeLocation =
    KeyRangeLocation'
    { _krlPersistentDirectory = Nothing
    , _krlDataDisk = Nothing
    , _krlStart = Nothing
    , _krlDeliveryEndpoint = Nothing
    , _krlEnd = Nothing
    }

-- | The location of the persistent state for this range, as a persistent
-- directory in the worker local filesystem.
krlPersistentDirectory :: Lens' KeyRangeLocation (Maybe Text)
krlPersistentDirectory
  = lens _krlPersistentDirectory
      (\ s a -> s{_krlPersistentDirectory = a})

-- | The name of the data disk where data for this range is stored. This name
-- is local to the Google Cloud Platform project and uniquely identifies
-- the disk within that project, for example
-- \"myproject-1014-104817-4c2-harness-0-disk-1\".
krlDataDisk :: Lens' KeyRangeLocation (Maybe Text)
krlDataDisk
  = lens _krlDataDisk (\ s a -> s{_krlDataDisk = a})

-- | The start (inclusive) of the key range.
krlStart :: Lens' KeyRangeLocation (Maybe Text)
krlStart = lens _krlStart (\ s a -> s{_krlStart = a})

-- | The physical location of this range assignment to be used for streaming
-- computation cross-worker message delivery.
krlDeliveryEndpoint :: Lens' KeyRangeLocation (Maybe Text)
krlDeliveryEndpoint
  = lens _krlDeliveryEndpoint
      (\ s a -> s{_krlDeliveryEndpoint = a})

-- | The end (exclusive) of the key range.
krlEnd :: Lens' KeyRangeLocation (Maybe Text)
krlEnd = lens _krlEnd (\ s a -> s{_krlEnd = a})

instance FromJSON KeyRangeLocation where
        parseJSON
          = withObject "KeyRangeLocation"
              (\ o ->
                 KeyRangeLocation' <$>
                   (o .:? "persistentDirectory") <*> (o .:? "dataDisk")
                     <*> (o .:? "start")
                     <*> (o .:? "deliveryEndpoint")
                     <*> (o .:? "end"))

instance ToJSON KeyRangeLocation where
        toJSON KeyRangeLocation'{..}
          = object
              (catMaybes
                 [("persistentDirectory" .=) <$>
                    _krlPersistentDirectory,
                  ("dataDisk" .=) <$> _krlDataDisk,
                  ("start" .=) <$> _krlStart,
                  ("deliveryEndpoint" .=) <$> _krlDeliveryEndpoint,
                  ("end" .=) <$> _krlEnd])

-- | Information about an output of a multi-output DoFn.
--
-- /See:/ 'multiOutputInfo' smart constructor.
newtype MultiOutputInfo = MultiOutputInfo'
    { _moiTag :: Maybe Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MultiOutputInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'moiTag'
multiOutputInfo
    :: MultiOutputInfo
multiOutputInfo =
    MultiOutputInfo'
    { _moiTag = Nothing
    }

-- | The id of the tag the user code will emit to this output by; this should
-- correspond to the tag of some SideInputInfo.
moiTag :: Lens' MultiOutputInfo (Maybe Text)
moiTag = lens _moiTag (\ s a -> s{_moiTag = a})

instance FromJSON MultiOutputInfo where
        parseJSON
          = withObject "MultiOutputInfo"
              (\ o -> MultiOutputInfo' <$> (o .:? "tag"))

instance ToJSON MultiOutputInfo where
        toJSON MultiOutputInfo'{..}
          = object (catMaybes [("tag" .=) <$> _moiTag])

-- | An instruction that does a partial group-by-key. One input and one
-- output.
--
-- /See:/ 'partialGroupByKeyInstruction' smart constructor.
data PartialGroupByKeyInstruction = PartialGroupByKeyInstruction'
    { _pgbkiValueCombiningFn                    :: !(Maybe PartialGroupByKeyInstructionValueCombiningFn)
    , _pgbkiSideInputs                          :: !(Maybe [SideInputInfo])
    , _pgbkiInput                               :: !(Maybe InstructionInput)
    , _pgbkiOriginalCombineValuesStepName       :: !(Maybe Text)
    , _pgbkiInputElementCodec                   :: !(Maybe PartialGroupByKeyInstructionInputElementCodec)
    , _pgbkiOriginalCombineValuesInputStoreName :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PartialGroupByKeyInstruction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pgbkiValueCombiningFn'
--
-- * 'pgbkiSideInputs'
--
-- * 'pgbkiInput'
--
-- * 'pgbkiOriginalCombineValuesStepName'
--
-- * 'pgbkiInputElementCodec'
--
-- * 'pgbkiOriginalCombineValuesInputStoreName'
partialGroupByKeyInstruction
    :: PartialGroupByKeyInstruction
partialGroupByKeyInstruction =
    PartialGroupByKeyInstruction'
    { _pgbkiValueCombiningFn = Nothing
    , _pgbkiSideInputs = Nothing
    , _pgbkiInput = Nothing
    , _pgbkiOriginalCombineValuesStepName = Nothing
    , _pgbkiInputElementCodec = Nothing
    , _pgbkiOriginalCombineValuesInputStoreName = Nothing
    }

-- | The value combining function to invoke.
pgbkiValueCombiningFn :: Lens' PartialGroupByKeyInstruction (Maybe PartialGroupByKeyInstructionValueCombiningFn)
pgbkiValueCombiningFn
  = lens _pgbkiValueCombiningFn
      (\ s a -> s{_pgbkiValueCombiningFn = a})

-- | Zero or more side inputs.
pgbkiSideInputs :: Lens' PartialGroupByKeyInstruction [SideInputInfo]
pgbkiSideInputs
  = lens _pgbkiSideInputs
      (\ s a -> s{_pgbkiSideInputs = a})
      . _Default
      . _Coerce

-- | Describes the input to the partial group-by-key instruction.
pgbkiInput :: Lens' PartialGroupByKeyInstruction (Maybe InstructionInput)
pgbkiInput
  = lens _pgbkiInput (\ s a -> s{_pgbkiInput = a})

-- | If this instruction includes a combining function, this is the name of
-- the CombineValues instruction lifted into this instruction.
pgbkiOriginalCombineValuesStepName :: Lens' PartialGroupByKeyInstruction (Maybe Text)
pgbkiOriginalCombineValuesStepName
  = lens _pgbkiOriginalCombineValuesStepName
      (\ s a -> s{_pgbkiOriginalCombineValuesStepName = a})

-- | The codec to use for interpreting an element in the input PTable.
pgbkiInputElementCodec :: Lens' PartialGroupByKeyInstruction (Maybe PartialGroupByKeyInstructionInputElementCodec)
pgbkiInputElementCodec
  = lens _pgbkiInputElementCodec
      (\ s a -> s{_pgbkiInputElementCodec = a})

-- | If this instruction includes a combining function this is the name of
-- the intermediate store between the GBK and the CombineValues.
pgbkiOriginalCombineValuesInputStoreName :: Lens' PartialGroupByKeyInstruction (Maybe Text)
pgbkiOriginalCombineValuesInputStoreName
  = lens _pgbkiOriginalCombineValuesInputStoreName
      (\ s a ->
         s{_pgbkiOriginalCombineValuesInputStoreName = a})

instance FromJSON PartialGroupByKeyInstruction where
        parseJSON
          = withObject "PartialGroupByKeyInstruction"
              (\ o ->
                 PartialGroupByKeyInstruction' <$>
                   (o .:? "valueCombiningFn") <*>
                     (o .:? "sideInputs" .!= mempty)
                     <*> (o .:? "input")
                     <*> (o .:? "originalCombineValuesStepName")
                     <*> (o .:? "inputElementCodec")
                     <*> (o .:? "originalCombineValuesInputStoreName"))

instance ToJSON PartialGroupByKeyInstruction where
        toJSON PartialGroupByKeyInstruction'{..}
          = object
              (catMaybes
                 [("valueCombiningFn" .=) <$> _pgbkiValueCombiningFn,
                  ("sideInputs" .=) <$> _pgbkiSideInputs,
                  ("input" .=) <$> _pgbkiInput,
                  ("originalCombineValuesStepName" .=) <$>
                    _pgbkiOriginalCombineValuesStepName,
                  ("inputElementCodec" .=) <$> _pgbkiInputElementCodec,
                  ("originalCombineValuesInputStoreName" .=) <$>
                    _pgbkiOriginalCombineValuesInputStoreName])

-- | An instruction that does a ParDo operation. Takes one main input and
-- zero or more side inputs, and produces zero or more outputs. Runs user
-- code.
--
-- /See:/ 'parDoInstruction' smart constructor.
data ParDoInstruction = ParDoInstruction'
    { _pdiNumOutputs       :: !(Maybe (Textual Int32))
    , _pdiMultiOutputInfos :: !(Maybe [MultiOutputInfo])
    , _pdiSideInputs       :: !(Maybe [SideInputInfo])
    , _pdiInput            :: !(Maybe InstructionInput)
    , _pdiUserFn           :: !(Maybe ParDoInstructionUserFn)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ParDoInstruction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pdiNumOutputs'
--
-- * 'pdiMultiOutputInfos'
--
-- * 'pdiSideInputs'
--
-- * 'pdiInput'
--
-- * 'pdiUserFn'
parDoInstruction
    :: ParDoInstruction
parDoInstruction =
    ParDoInstruction'
    { _pdiNumOutputs = Nothing
    , _pdiMultiOutputInfos = Nothing
    , _pdiSideInputs = Nothing
    , _pdiInput = Nothing
    , _pdiUserFn = Nothing
    }

-- | The number of outputs.
pdiNumOutputs :: Lens' ParDoInstruction (Maybe Int32)
pdiNumOutputs
  = lens _pdiNumOutputs
      (\ s a -> s{_pdiNumOutputs = a})
      . mapping _Coerce

-- | Information about each of the outputs, if user_fn is a MultiDoFn.
pdiMultiOutputInfos :: Lens' ParDoInstruction [MultiOutputInfo]
pdiMultiOutputInfos
  = lens _pdiMultiOutputInfos
      (\ s a -> s{_pdiMultiOutputInfos = a})
      . _Default
      . _Coerce

-- | Zero or more side inputs.
pdiSideInputs :: Lens' ParDoInstruction [SideInputInfo]
pdiSideInputs
  = lens _pdiSideInputs
      (\ s a -> s{_pdiSideInputs = a})
      . _Default
      . _Coerce

-- | The input.
pdiInput :: Lens' ParDoInstruction (Maybe InstructionInput)
pdiInput = lens _pdiInput (\ s a -> s{_pdiInput = a})

-- | The user function to invoke.
pdiUserFn :: Lens' ParDoInstruction (Maybe ParDoInstructionUserFn)
pdiUserFn
  = lens _pdiUserFn (\ s a -> s{_pdiUserFn = a})

instance FromJSON ParDoInstruction where
        parseJSON
          = withObject "ParDoInstruction"
              (\ o ->
                 ParDoInstruction' <$>
                   (o .:? "numOutputs") <*>
                     (o .:? "multiOutputInfos" .!= mempty)
                     <*> (o .:? "sideInputs" .!= mempty)
                     <*> (o .:? "input")
                     <*> (o .:? "userFn"))

instance ToJSON ParDoInstruction where
        toJSON ParDoInstruction'{..}
          = object
              (catMaybes
                 [("numOutputs" .=) <$> _pdiNumOutputs,
                  ("multiOutputInfos" .=) <$> _pdiMultiOutputInfos,
                  ("sideInputs" .=) <$> _pdiSideInputs,
                  ("input" .=) <$> _pdiInput,
                  ("userFn" .=) <$> _pdiUserFn])

-- | Identifies the location of a custom souce.
--
-- /See:/ 'customSourceLocation' smart constructor.
newtype CustomSourceLocation = CustomSourceLocation'
    { _cslStateful :: Maybe Bool
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'CustomSourceLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'cslStateful'
customSourceLocation
    :: CustomSourceLocation
customSourceLocation =
    CustomSourceLocation'
    { _cslStateful = Nothing
    }

-- | Whether this source is stateful.
cslStateful :: Lens' CustomSourceLocation (Maybe Bool)
cslStateful
  = lens _cslStateful (\ s a -> s{_cslStateful = a})

instance FromJSON CustomSourceLocation where
        parseJSON
          = withObject "CustomSourceLocation"
              (\ o -> CustomSourceLocation' <$> (o .:? "stateful"))

instance ToJSON CustomSourceLocation where
        toJSON CustomSourceLocation'{..}
          = object
              (catMaybes [("stateful" .=) <$> _cslStateful])

-- | A metric value representing a distribution.
--
-- /See:/ 'distributionUpdate' smart constructor.
data DistributionUpdate = DistributionUpdate'
    { _duMax          :: !(Maybe SplitInt64)
    , _duCount        :: !(Maybe SplitInt64)
    , _duMin          :: !(Maybe SplitInt64)
    , _duSumOfSquares :: !(Maybe (Textual Double))
    , _duSum          :: !(Maybe SplitInt64)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'DistributionUpdate' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'duMax'
--
-- * 'duCount'
--
-- * 'duMin'
--
-- * 'duSumOfSquares'
--
-- * 'duSum'
distributionUpdate
    :: DistributionUpdate
distributionUpdate =
    DistributionUpdate'
    { _duMax = Nothing
    , _duCount = Nothing
    , _duMin = Nothing
    , _duSumOfSquares = Nothing
    , _duSum = Nothing
    }

-- | The maximum value present in the distribution.
duMax :: Lens' DistributionUpdate (Maybe SplitInt64)
duMax = lens _duMax (\ s a -> s{_duMax = a})

-- | The count of the number of elements present in the distribution.
duCount :: Lens' DistributionUpdate (Maybe SplitInt64)
duCount = lens _duCount (\ s a -> s{_duCount = a})

-- | The minimum value present in the distribution.
duMin :: Lens' DistributionUpdate (Maybe SplitInt64)
duMin = lens _duMin (\ s a -> s{_duMin = a})

-- | Use a double since the sum of squares is likely to overflow int64.
duSumOfSquares :: Lens' DistributionUpdate (Maybe Double)
duSumOfSquares
  = lens _duSumOfSquares
      (\ s a -> s{_duSumOfSquares = a})
      . mapping _Coerce

-- | Use an int64 since we\'d prefer the added precision. If overflow is a
-- common problem we can detect it and use an additional int64 or a double.
duSum :: Lens' DistributionUpdate (Maybe SplitInt64)
duSum = lens _duSum (\ s a -> s{_duSum = a})

instance FromJSON DistributionUpdate where
        parseJSON
          = withObject "DistributionUpdate"
              (\ o ->
                 DistributionUpdate' <$>
                   (o .:? "max") <*> (o .:? "count") <*> (o .:? "min")
                     <*> (o .:? "sumOfSquares")
                     <*> (o .:? "sum"))

instance ToJSON DistributionUpdate where
        toJSON DistributionUpdate'{..}
          = object
              (catMaybes
                 [("max" .=) <$> _duMax, ("count" .=) <$> _duCount,
                  ("min" .=) <$> _duMin,
                  ("sumOfSquares" .=) <$> _duSumOfSquares,
                  ("sum" .=) <$> _duSum])

--
-- /See:/ 'sourceBaseSpecsItem' smart constructor.
newtype SourceBaseSpecsItem = SourceBaseSpecsItem'
    { _sbsiAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceBaseSpecsItem' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sbsiAddtional'
sourceBaseSpecsItem
    :: HashMap Text JSONValue -- ^ 'sbsiAddtional'
    -> SourceBaseSpecsItem
sourceBaseSpecsItem pSbsiAddtional_ =
    SourceBaseSpecsItem'
    { _sbsiAddtional = _Coerce # pSbsiAddtional_
    }

-- | Properties of the object.
sbsiAddtional :: Lens' SourceBaseSpecsItem (HashMap Text JSONValue)
sbsiAddtional
  = lens _sbsiAddtional
      (\ s a -> s{_sbsiAddtional = a})
      . _Coerce

instance FromJSON SourceBaseSpecsItem where
        parseJSON
          = withObject "SourceBaseSpecsItem"
              (\ o -> SourceBaseSpecsItem' <$> (parseJSONObject o))

instance ToJSON SourceBaseSpecsItem where
        toJSON = toJSON . _sbsiAddtional

-- | Describes a particular operation comprising a MapTask.
--
-- /See:/ 'parallelInstruction' smart constructor.
data ParallelInstruction = ParallelInstruction'
    { _piRead              :: !(Maybe ReadInstruction)
    , _piWrite             :: !(Maybe WriteInstruction)
    , _piParDo             :: !(Maybe ParDoInstruction)
    , _piPartialGroupByKey :: !(Maybe PartialGroupByKeyInstruction)
    , _piOutputs           :: !(Maybe [InstructionOutput])
    , _piName              :: !(Maybe Text)
    , _piSystemName        :: !(Maybe Text)
    , _piFlatten           :: !(Maybe FlattenInstruction)
    , _piOriginalName      :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ParallelInstruction' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'piRead'
--
-- * 'piWrite'
--
-- * 'piParDo'
--
-- * 'piPartialGroupByKey'
--
-- * 'piOutputs'
--
-- * 'piName'
--
-- * 'piSystemName'
--
-- * 'piFlatten'
--
-- * 'piOriginalName'
parallelInstruction
    :: ParallelInstruction
parallelInstruction =
    ParallelInstruction'
    { _piRead = Nothing
    , _piWrite = Nothing
    , _piParDo = Nothing
    , _piPartialGroupByKey = Nothing
    , _piOutputs = Nothing
    , _piName = Nothing
    , _piSystemName = Nothing
    , _piFlatten = Nothing
    , _piOriginalName = Nothing
    }

-- | Additional information for Read instructions.
piRead :: Lens' ParallelInstruction (Maybe ReadInstruction)
piRead = lens _piRead (\ s a -> s{_piRead = a})

-- | Additional information for Write instructions.
piWrite :: Lens' ParallelInstruction (Maybe WriteInstruction)
piWrite = lens _piWrite (\ s a -> s{_piWrite = a})

-- | Additional information for ParDo instructions.
piParDo :: Lens' ParallelInstruction (Maybe ParDoInstruction)
piParDo = lens _piParDo (\ s a -> s{_piParDo = a})

-- | Additional information for PartialGroupByKey instructions.
piPartialGroupByKey :: Lens' ParallelInstruction (Maybe PartialGroupByKeyInstruction)
piPartialGroupByKey
  = lens _piPartialGroupByKey
      (\ s a -> s{_piPartialGroupByKey = a})

-- | Describes the outputs of the instruction.
piOutputs :: Lens' ParallelInstruction [InstructionOutput]
piOutputs
  = lens _piOutputs (\ s a -> s{_piOutputs = a}) .
      _Default
      . _Coerce

-- | User-provided name of this operation.
piName :: Lens' ParallelInstruction (Maybe Text)
piName = lens _piName (\ s a -> s{_piName = a})

-- | System-defined name of this operation. Unique across the workflow.
piSystemName :: Lens' ParallelInstruction (Maybe Text)
piSystemName
  = lens _piSystemName (\ s a -> s{_piSystemName = a})

-- | Additional information for Flatten instructions.
piFlatten :: Lens' ParallelInstruction (Maybe FlattenInstruction)
piFlatten
  = lens _piFlatten (\ s a -> s{_piFlatten = a})

-- | System-defined name for the operation in the original workflow graph.
piOriginalName :: Lens' ParallelInstruction (Maybe Text)
piOriginalName
  = lens _piOriginalName
      (\ s a -> s{_piOriginalName = a})

instance FromJSON ParallelInstruction where
        parseJSON
          = withObject "ParallelInstruction"
              (\ o ->
                 ParallelInstruction' <$>
                   (o .:? "read") <*> (o .:? "write") <*>
                     (o .:? "parDo")
                     <*> (o .:? "partialGroupByKey")
                     <*> (o .:? "outputs" .!= mempty)
                     <*> (o .:? "name")
                     <*> (o .:? "systemName")
                     <*> (o .:? "flatten")
                     <*> (o .:? "originalName"))

instance ToJSON ParallelInstruction where
        toJSON ParallelInstruction'{..}
          = object
              (catMaybes
                 [("read" .=) <$> _piRead, ("write" .=) <$> _piWrite,
                  ("parDo" .=) <$> _piParDo,
                  ("partialGroupByKey" .=) <$> _piPartialGroupByKey,
                  ("outputs" .=) <$> _piOutputs,
                  ("name" .=) <$> _piName,
                  ("systemName" .=) <$> _piSystemName,
                  ("flatten" .=) <$> _piFlatten,
                  ("originalName" .=) <$> _piOriginalName])

-- | How to interpret the source element(s) as a side input value.
--
-- /See:/ 'sideInputInfoKind' smart constructor.
newtype SideInputInfoKind = SideInputInfoKind'
    { _siikAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SideInputInfoKind' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'siikAddtional'
sideInputInfoKind
    :: HashMap Text JSONValue -- ^ 'siikAddtional'
    -> SideInputInfoKind
sideInputInfoKind pSiikAddtional_ =
    SideInputInfoKind'
    { _siikAddtional = _Coerce # pSiikAddtional_
    }

-- | Properties of the object.
siikAddtional :: Lens' SideInputInfoKind (HashMap Text JSONValue)
siikAddtional
  = lens _siikAddtional
      (\ s a -> s{_siikAddtional = a})
      . _Coerce

instance FromJSON SideInputInfoKind where
        parseJSON
          = withObject "SideInputInfoKind"
              (\ o -> SideInputInfoKind' <$> (parseJSONObject o))

instance ToJSON SideInputInfoKind where
        toJSON = toJSON . _siikAddtional

-- | A task that carries configuration information for streaming
-- computations.
--
-- /See:/ 'streamingConfigTask' smart constructor.
data StreamingConfigTask = StreamingConfigTask'
    { _sctUserStepToStateFamilyNameMap :: !(Maybe StreamingConfigTaskUserStepToStateFamilyNameMap)
    , _sctStreamingComputationConfigs  :: !(Maybe [StreamingComputationConfig])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingConfigTask' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sctUserStepToStateFamilyNameMap'
--
-- * 'sctStreamingComputationConfigs'
streamingConfigTask
    :: StreamingConfigTask
streamingConfigTask =
    StreamingConfigTask'
    { _sctUserStepToStateFamilyNameMap = Nothing
    , _sctStreamingComputationConfigs = Nothing
    }

-- | Map from user step names to state families.
sctUserStepToStateFamilyNameMap :: Lens' StreamingConfigTask (Maybe StreamingConfigTaskUserStepToStateFamilyNameMap)
sctUserStepToStateFamilyNameMap
  = lens _sctUserStepToStateFamilyNameMap
      (\ s a -> s{_sctUserStepToStateFamilyNameMap = a})

-- | Set of computation configuration information.
sctStreamingComputationConfigs :: Lens' StreamingConfigTask [StreamingComputationConfig]
sctStreamingComputationConfigs
  = lens _sctStreamingComputationConfigs
      (\ s a -> s{_sctStreamingComputationConfigs = a})
      . _Default
      . _Coerce

instance FromJSON StreamingConfigTask where
        parseJSON
          = withObject "StreamingConfigTask"
              (\ o ->
                 StreamingConfigTask' <$>
                   (o .:? "userStepToStateFamilyNameMap") <*>
                     (o .:? "streamingComputationConfigs" .!= mempty))

instance ToJSON StreamingConfigTask where
        toJSON StreamingConfigTask'{..}
          = object
              (catMaybes
                 [("userStepToStateFamilyNameMap" .=) <$>
                    _sctUserStepToStateFamilyNameMap,
                  ("streamingComputationConfigs" .=) <$>
                    _sctStreamingComputationConfigs])

-- | The metric short id is returned to the user alongside an offset into
-- ReportWorkItemStatusRequest
--
-- /See:/ 'metricShortId' smart constructor.
data MetricShortId = MetricShortId'
    { _msiShortId     :: !(Maybe (Textual Int64))
    , _msiMetricIndex :: !(Maybe (Textual Int32))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'MetricShortId' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'msiShortId'
--
-- * 'msiMetricIndex'
metricShortId
    :: MetricShortId
metricShortId =
    MetricShortId'
    { _msiShortId = Nothing
    , _msiMetricIndex = Nothing
    }

-- | The service-generated short identifier for the metric.
msiShortId :: Lens' MetricShortId (Maybe Int64)
msiShortId
  = lens _msiShortId (\ s a -> s{_msiShortId = a}) .
      mapping _Coerce

-- | The index of the corresponding metric in the
-- ReportWorkItemStatusRequest. Required.
msiMetricIndex :: Lens' MetricShortId (Maybe Int32)
msiMetricIndex
  = lens _msiMetricIndex
      (\ s a -> s{_msiMetricIndex = a})
      . mapping _Coerce

instance FromJSON MetricShortId where
        parseJSON
          = withObject "MetricShortId"
              (\ o ->
                 MetricShortId' <$>
                   (o .:? "shortId") <*> (o .:? "metricIndex"))

instance ToJSON MetricShortId where
        toJSON MetricShortId'{..}
          = object
              (catMaybes
                 [("shortId" .=) <$> _msiShortId,
                  ("metricIndex" .=) <$> _msiMetricIndex])

-- | A request for sending worker messages to the service.
--
-- /See:/ 'sendWorkerMessagesRequest' smart constructor.
newtype SendWorkerMessagesRequest = SendWorkerMessagesRequest'
    { _swmrWorkerMessages :: Maybe [WorkerMessage]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SendWorkerMessagesRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'swmrWorkerMessages'
sendWorkerMessagesRequest
    :: SendWorkerMessagesRequest
sendWorkerMessagesRequest =
    SendWorkerMessagesRequest'
    { _swmrWorkerMessages = Nothing
    }

-- | The WorkerMessages to send.
swmrWorkerMessages :: Lens' SendWorkerMessagesRequest [WorkerMessage]
swmrWorkerMessages
  = lens _swmrWorkerMessages
      (\ s a -> s{_swmrWorkerMessages = a})
      . _Default
      . _Coerce

instance FromJSON SendWorkerMessagesRequest where
        parseJSON
          = withObject "SendWorkerMessagesRequest"
              (\ o ->
                 SendWorkerMessagesRequest' <$>
                   (o .:? "workerMessages" .!= mempty))

instance ToJSON SendWorkerMessagesRequest where
        toJSON SendWorkerMessagesRequest'{..}
          = object
              (catMaybes
                 [("workerMessages" .=) <$> _swmrWorkerMessages])

-- | DEPRECATED in favor of DerivedSource.
--
-- /See:/ 'sourceSplitShard' smart constructor.
data SourceSplitShard = SourceSplitShard'
    { _sssDerivationMode :: !(Maybe Text)
    , _sssSource         :: !(Maybe Source)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceSplitShard' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sssDerivationMode'
--
-- * 'sssSource'
sourceSplitShard
    :: SourceSplitShard
sourceSplitShard =
    SourceSplitShard'
    { _sssDerivationMode = Nothing
    , _sssSource = Nothing
    }

-- | DEPRECATED
sssDerivationMode :: Lens' SourceSplitShard (Maybe Text)
sssDerivationMode
  = lens _sssDerivationMode
      (\ s a -> s{_sssDerivationMode = a})

-- | DEPRECATED
sssSource :: Lens' SourceSplitShard (Maybe Source)
sssSource
  = lens _sssSource (\ s a -> s{_sssSource = a})

instance FromJSON SourceSplitShard where
        parseJSON
          = withObject "SourceSplitShard"
              (\ o ->
                 SourceSplitShard' <$>
                   (o .:? "derivationMode") <*> (o .:? "source"))

instance ToJSON SourceSplitShard where
        toJSON SourceSplitShard'{..}
          = object
              (catMaybes
                 [("derivationMode" .=) <$> _sssDerivationMode,
                  ("source" .=) <$> _sssSource])

-- | Information about a side input of a DoFn or an input of a SeqDoFn.
--
-- /See:/ 'sideInputInfo' smart constructor.
data SideInputInfo = SideInputInfo'
    { _siiTag     :: !(Maybe Text)
    , _siiKind    :: !(Maybe SideInputInfoKind)
    , _siiSources :: !(Maybe [Source])
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SideInputInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'siiTag'
--
-- * 'siiKind'
--
-- * 'siiSources'
sideInputInfo
    :: SideInputInfo
sideInputInfo =
    SideInputInfo'
    { _siiTag = Nothing
    , _siiKind = Nothing
    , _siiSources = Nothing
    }

-- | The id of the tag the user code will access this side input by; this
-- should correspond to the tag of some MultiOutputInfo.
siiTag :: Lens' SideInputInfo (Maybe Text)
siiTag = lens _siiTag (\ s a -> s{_siiTag = a})

-- | How to interpret the source element(s) as a side input value.
siiKind :: Lens' SideInputInfo (Maybe SideInputInfoKind)
siiKind = lens _siiKind (\ s a -> s{_siiKind = a})

-- | The source(s) to read element(s) from to get the value of this side
-- input. If more than one source, then the elements are taken from the
-- sources, in the specified order if order matters. At least one source is
-- required.
siiSources :: Lens' SideInputInfo [Source]
siiSources
  = lens _siiSources (\ s a -> s{_siiSources = a}) .
      _Default
      . _Coerce

instance FromJSON SideInputInfo where
        parseJSON
          = withObject "SideInputInfo"
              (\ o ->
                 SideInputInfo' <$>
                   (o .:? "tag") <*> (o .:? "kind") <*>
                     (o .:? "sources" .!= mempty))

instance ToJSON SideInputInfo where
        toJSON SideInputInfo'{..}
          = object
              (catMaybes
                 [("tag" .=) <$> _siiTag, ("kind" .=) <$> _siiKind,
                  ("sources" .=) <$> _siiSources])

-- | Additional information about how a Cloud Dataflow job will be executed
-- that isn\'t contained in the submitted job.
--
-- /See:/ 'jobExecutionInfo' smart constructor.
newtype JobExecutionInfo = JobExecutionInfo'
    { _jeiStages :: Maybe JobExecutionInfoStages
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'JobExecutionInfo' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'jeiStages'
jobExecutionInfo
    :: JobExecutionInfo
jobExecutionInfo =
    JobExecutionInfo'
    { _jeiStages = Nothing
    }

-- | A mapping from each stage to the information about that stage.
jeiStages :: Lens' JobExecutionInfo (Maybe JobExecutionInfoStages)
jeiStages
  = lens _jeiStages (\ s a -> s{_jeiStages = a})

instance FromJSON JobExecutionInfo where
        parseJSON
          = withObject "JobExecutionInfo"
              (\ o -> JobExecutionInfo' <$> (o .:? "stages"))

instance ToJSON JobExecutionInfo where
        toJSON JobExecutionInfo'{..}
          = object (catMaybes [("stages" .=) <$> _jeiStages])

-- | The codec to use to decode data read from the source.
--
-- /See:/ 'sourceCodec' smart constructor.
newtype SourceCodec = SourceCodec'
    { _souAddtional :: HashMap Text JSONValue
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceCodec' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'souAddtional'
sourceCodec
    :: HashMap Text JSONValue -- ^ 'souAddtional'
    -> SourceCodec
sourceCodec pSouAddtional_ =
    SourceCodec'
    { _souAddtional = _Coerce # pSouAddtional_
    }

-- | Properties of the object.
souAddtional :: Lens' SourceCodec (HashMap Text JSONValue)
souAddtional
  = lens _souAddtional (\ s a -> s{_souAddtional = a})
      . _Coerce

instance FromJSON SourceCodec where
        parseJSON
          = withObject "SourceCodec"
              (\ o -> SourceCodec' <$> (parseJSONObject o))

instance ToJSON SourceCodec where
        toJSON = toJSON . _souAddtional

-- | State family configuration.
--
-- /See:/ 'stateFamilyConfig' smart constructor.
data StateFamilyConfig = StateFamilyConfig'
    { _sfcIsRead      :: !(Maybe Bool)
    , _sfcStateFamily :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StateFamilyConfig' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sfcIsRead'
--
-- * 'sfcStateFamily'
stateFamilyConfig
    :: StateFamilyConfig
stateFamilyConfig =
    StateFamilyConfig'
    { _sfcIsRead = Nothing
    , _sfcStateFamily = Nothing
    }

-- | If true, this family corresponds to a read operation.
sfcIsRead :: Lens' StateFamilyConfig (Maybe Bool)
sfcIsRead
  = lens _sfcIsRead (\ s a -> s{_sfcIsRead = a})

-- | The state family value.
sfcStateFamily :: Lens' StateFamilyConfig (Maybe Text)
sfcStateFamily
  = lens _sfcStateFamily
      (\ s a -> s{_sfcStateFamily = a})

instance FromJSON StateFamilyConfig where
        parseJSON
          = withObject "StateFamilyConfig"
              (\ o ->
                 StateFamilyConfig' <$>
                   (o .:? "isRead") <*> (o .:? "stateFamily"))

instance ToJSON StateFamilyConfig where
        toJSON StateFamilyConfig'{..}
          = object
              (catMaybes
                 [("isRead" .=) <$> _sfcIsRead,
                  ("stateFamily" .=) <$> _sfcStateFamily])

-- | Data disk assignment information for a specific key-range of a sharded
-- computation. Currently we only support UTF-8 character splits to
-- simplify encoding into JSON.
--
-- /See:/ 'keyRangeDataDiskAssignment' smart constructor.
data KeyRangeDataDiskAssignment = KeyRangeDataDiskAssignment'
    { _krddaDataDisk :: !(Maybe Text)
    , _krddaStart    :: !(Maybe Text)
    , _krddaEnd      :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'KeyRangeDataDiskAssignment' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'krddaDataDisk'
--
-- * 'krddaStart'
--
-- * 'krddaEnd'
keyRangeDataDiskAssignment
    :: KeyRangeDataDiskAssignment
keyRangeDataDiskAssignment =
    KeyRangeDataDiskAssignment'
    { _krddaDataDisk = Nothing
    , _krddaStart = Nothing
    , _krddaEnd = Nothing
    }

-- | The name of the data disk where data for this range is stored. This name
-- is local to the Google Cloud Platform project and uniquely identifies
-- the disk within that project, for example
-- \"myproject-1014-104817-4c2-harness-0-disk-1\".
krddaDataDisk :: Lens' KeyRangeDataDiskAssignment (Maybe Text)
krddaDataDisk
  = lens _krddaDataDisk
      (\ s a -> s{_krddaDataDisk = a})

-- | The start (inclusive) of the key range.
krddaStart :: Lens' KeyRangeDataDiskAssignment (Maybe Text)
krddaStart
  = lens _krddaStart (\ s a -> s{_krddaStart = a})

-- | The end (exclusive) of the key range.
krddaEnd :: Lens' KeyRangeDataDiskAssignment (Maybe Text)
krddaEnd = lens _krddaEnd (\ s a -> s{_krddaEnd = a})

instance FromJSON KeyRangeDataDiskAssignment where
        parseJSON
          = withObject "KeyRangeDataDiskAssignment"
              (\ o ->
                 KeyRangeDataDiskAssignment' <$>
                   (o .:? "dataDisk") <*> (o .:? "start") <*>
                     (o .:? "end"))

instance ToJSON KeyRangeDataDiskAssignment where
        toJSON KeyRangeDataDiskAssignment'{..}
          = object
              (catMaybes
                 [("dataDisk" .=) <$> _krddaDataDisk,
                  ("start" .=) <$> _krddaStart,
                  ("end" .=) <$> _krddaEnd])

-- | Represents the operation to split a high-level Source specification into
-- bundles (parts for parallel processing). At a high level, splitting of a
-- source into bundles happens as follows: SourceSplitRequest is applied to
-- the source. If it returns SOURCE_SPLIT_OUTCOME_USE_CURRENT, no further
-- splitting happens and the source is used \"as is\". Otherwise, splitting
-- is applied recursively to each produced DerivedSource. As an
-- optimization, for any Source, if its does_not_need_splitting is true,
-- the framework assumes that splitting this source would return
-- SOURCE_SPLIT_OUTCOME_USE_CURRENT, and doesn\'t initiate a
-- SourceSplitRequest. This applies both to the initial source being split
-- and to bundles produced from it.
--
-- /See:/ 'sourceSplitRequest' smart constructor.
data SourceSplitRequest = SourceSplitRequest'
    { _ssrSource  :: !(Maybe Source)
    , _ssrOptions :: !(Maybe SourceSplitOptions)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceSplitRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ssrSource'
--
-- * 'ssrOptions'
sourceSplitRequest
    :: SourceSplitRequest
sourceSplitRequest =
    SourceSplitRequest'
    { _ssrSource = Nothing
    , _ssrOptions = Nothing
    }

-- | Specification of the source to be split.
ssrSource :: Lens' SourceSplitRequest (Maybe Source)
ssrSource
  = lens _ssrSource (\ s a -> s{_ssrSource = a})

-- | Hints for tuning the splitting process.
ssrOptions :: Lens' SourceSplitRequest (Maybe SourceSplitOptions)
ssrOptions
  = lens _ssrOptions (\ s a -> s{_ssrOptions = a})

instance FromJSON SourceSplitRequest where
        parseJSON
          = withObject "SourceSplitRequest"
              (\ o ->
                 SourceSplitRequest' <$>
                   (o .:? "source") <*> (o .:? "options"))

instance ToJSON SourceSplitRequest where
        toJSON SourceSplitRequest'{..}
          = object
              (catMaybes
                 [("source" .=) <$> _ssrSource,
                  ("options" .=) <$> _ssrOptions])

-- | Response to a request to list job messages.
--
-- /See:/ 'listJobMessagesResponse' smart constructor.
data ListJobMessagesResponse = ListJobMessagesResponse'
    { _ljmrJobMessages   :: !(Maybe [JobMessage])
    , _ljmrNextPageToken :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'ListJobMessagesResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'ljmrJobMessages'
--
-- * 'ljmrNextPageToken'
listJobMessagesResponse
    :: ListJobMessagesResponse
listJobMessagesResponse =
    ListJobMessagesResponse'
    { _ljmrJobMessages = Nothing
    , _ljmrNextPageToken = Nothing
    }

-- | Messages in ascending timestamp order.
ljmrJobMessages :: Lens' ListJobMessagesResponse [JobMessage]
ljmrJobMessages
  = lens _ljmrJobMessages
      (\ s a -> s{_ljmrJobMessages = a})
      . _Default
      . _Coerce

-- | The token to obtain the next page of results if there are more.
ljmrNextPageToken :: Lens' ListJobMessagesResponse (Maybe Text)
ljmrNextPageToken
  = lens _ljmrNextPageToken
      (\ s a -> s{_ljmrNextPageToken = a})

instance FromJSON ListJobMessagesResponse where
        parseJSON
          = withObject "ListJobMessagesResponse"
              (\ o ->
                 ListJobMessagesResponse' <$>
                   (o .:? "jobMessages" .!= mempty) <*>
                     (o .:? "nextPageToken"))

instance ToJSON ListJobMessagesResponse where
        toJSON ListJobMessagesResponse'{..}
          = object
              (catMaybes
                 [("jobMessages" .=) <$> _ljmrJobMessages,
                  ("nextPageToken" .=) <$> _ljmrNextPageToken])

-- | Identifies a pubsub location to use for transferring data into or out of
-- a streaming Dataflow job.
--
-- /See:/ 'pubsubLocation' smart constructor.
data PubsubLocation = PubsubLocation'
    { _plTrackingSubscription :: !(Maybe Text)
    , _plDropLateData         :: !(Maybe Bool)
    , _plTimestampLabel       :: !(Maybe Text)
    , _plIdLabel              :: !(Maybe Text)
    , _plTopic                :: !(Maybe Text)
    , _plWithAttributes       :: !(Maybe Bool)
    , _plSubscription         :: !(Maybe Text)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'PubsubLocation' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'plTrackingSubscription'
--
-- * 'plDropLateData'
--
-- * 'plTimestampLabel'
--
-- * 'plIdLabel'
--
-- * 'plTopic'
--
-- * 'plWithAttributes'
--
-- * 'plSubscription'
pubsubLocation
    :: PubsubLocation
pubsubLocation =
    PubsubLocation'
    { _plTrackingSubscription = Nothing
    , _plDropLateData = Nothing
    , _plTimestampLabel = Nothing
    , _plIdLabel = Nothing
    , _plTopic = Nothing
    , _plWithAttributes = Nothing
    , _plSubscription = Nothing
    }

-- | If set, specifies the pubsub subscription that will be used for tracking
-- custom time timestamps for watermark estimation.
plTrackingSubscription :: Lens' PubsubLocation (Maybe Text)
plTrackingSubscription
  = lens _plTrackingSubscription
      (\ s a -> s{_plTrackingSubscription = a})

-- | Indicates whether the pipeline allows late-arriving data.
plDropLateData :: Lens' PubsubLocation (Maybe Bool)
plDropLateData
  = lens _plDropLateData
      (\ s a -> s{_plDropLateData = a})

-- | If set, contains a pubsub label from which to extract record timestamps.
-- If left empty, record timestamps will be generated upon arrival.
plTimestampLabel :: Lens' PubsubLocation (Maybe Text)
plTimestampLabel
  = lens _plTimestampLabel
      (\ s a -> s{_plTimestampLabel = a})

-- | If set, contains a pubsub label from which to extract record ids. If
-- left empty, record deduplication will be strictly best effort.
plIdLabel :: Lens' PubsubLocation (Maybe Text)
plIdLabel
  = lens _plIdLabel (\ s a -> s{_plIdLabel = a})

-- | A pubsub topic, in the form of \"pubsub.googleapis.com\/topics\/ \/\"
plTopic :: Lens' PubsubLocation (Maybe Text)
plTopic = lens _plTopic (\ s a -> s{_plTopic = a})

-- | If true, then the client has requested to get pubsub attributes.
plWithAttributes :: Lens' PubsubLocation (Maybe Bool)
plWithAttributes
  = lens _plWithAttributes
      (\ s a -> s{_plWithAttributes = a})

-- | A pubsub subscription, in the form of
-- \"pubsub.googleapis.com\/subscriptions\/ \/\"
plSubscription :: Lens' PubsubLocation (Maybe Text)
plSubscription
  = lens _plSubscription
      (\ s a -> s{_plSubscription = a})

instance FromJSON PubsubLocation where
        parseJSON
          = withObject "PubsubLocation"
              (\ o ->
                 PubsubLocation' <$>
                   (o .:? "trackingSubscription") <*>
                     (o .:? "dropLateData")
                     <*> (o .:? "timestampLabel")
                     <*> (o .:? "idLabel")
                     <*> (o .:? "topic")
                     <*> (o .:? "withAttributes")
                     <*> (o .:? "subscription"))

instance ToJSON PubsubLocation where
        toJSON PubsubLocation'{..}
          = object
              (catMaybes
                 [("trackingSubscription" .=) <$>
                    _plTrackingSubscription,
                  ("dropLateData" .=) <$> _plDropLateData,
                  ("timestampLabel" .=) <$> _plTimestampLabel,
                  ("idLabel" .=) <$> _plIdLabel,
                  ("topic" .=) <$> _plTopic,
                  ("withAttributes" .=) <$> _plWithAttributes,
                  ("subscription" .=) <$> _plSubscription])

-- | A metric value representing a list of floating point numbers.
--
-- /See:/ 'floatingPointList' smart constructor.
newtype FloatingPointList = FloatingPointList'
    { _fplElements :: Maybe [Textual Double]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'FloatingPointList' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'fplElements'
floatingPointList
    :: FloatingPointList
floatingPointList =
    FloatingPointList'
    { _fplElements = Nothing
    }

-- | Elements of the list.
fplElements :: Lens' FloatingPointList [Double]
fplElements
  = lens _fplElements (\ s a -> s{_fplElements = a}) .
      _Default
      . _Coerce

instance FromJSON FloatingPointList where
        parseJSON
          = withObject "FloatingPointList"
              (\ o ->
                 FloatingPointList' <$> (o .:? "elements" .!= mempty))

instance ToJSON FloatingPointList where
        toJSON FloatingPointList'{..}
          = object
              (catMaybes [("elements" .=) <$> _fplElements])

-- | An input of an instruction, as a reference to an output of a producer
-- instruction.
--
-- /See:/ 'instructionInput' smart constructor.
data InstructionInput = InstructionInput'
    { _iiProducerInstructionIndex :: !(Maybe (Textual Int32))
    , _iiOutputNum                :: !(Maybe (Textual Int32))
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'InstructionInput' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'iiProducerInstructionIndex'
--
-- * 'iiOutputNum'
instructionInput
    :: InstructionInput
instructionInput =
    InstructionInput'
    { _iiProducerInstructionIndex = Nothing
    , _iiOutputNum = Nothing
    }

-- | The index (origin zero) of the parallel instruction that produces the
-- output to be consumed by this input. This index is relative to the list
-- of instructions in this input\'s instruction\'s containing MapTask.
iiProducerInstructionIndex :: Lens' InstructionInput (Maybe Int32)
iiProducerInstructionIndex
  = lens _iiProducerInstructionIndex
      (\ s a -> s{_iiProducerInstructionIndex = a})
      . mapping _Coerce

-- | The output index (origin zero) within the producer.
iiOutputNum :: Lens' InstructionInput (Maybe Int32)
iiOutputNum
  = lens _iiOutputNum (\ s a -> s{_iiOutputNum = a}) .
      mapping _Coerce

instance FromJSON InstructionInput where
        parseJSON
          = withObject "InstructionInput"
              (\ o ->
                 InstructionInput' <$>
                   (o .:? "producerInstructionIndex") <*>
                     (o .:? "outputNum"))

instance ToJSON InstructionInput where
        toJSON InstructionInput'{..}
          = object
              (catMaybes
                 [("producerInstructionIndex" .=) <$>
                    _iiProducerInstructionIndex,
                  ("outputNum" .=) <$> _iiOutputNum])

-- | Describes a particular function to invoke.
--
-- /See:/ 'seqMapTask' smart constructor.
data SeqMapTask = SeqMapTask'
    { _smtInputs      :: !(Maybe [SideInputInfo])
    , _smtName        :: !(Maybe Text)
    , _smtOutputInfos :: !(Maybe [SeqMapTaskOutputInfo])
    , _smtSystemName  :: !(Maybe Text)
    , _smtStageName   :: !(Maybe Text)
    , _smtUserFn      :: !(Maybe SeqMapTaskUserFn)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SeqMapTask' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'smtInputs'
--
-- * 'smtName'
--
-- * 'smtOutputInfos'
--
-- * 'smtSystemName'
--
-- * 'smtStageName'
--
-- * 'smtUserFn'
seqMapTask
    :: SeqMapTask
seqMapTask =
    SeqMapTask'
    { _smtInputs = Nothing
    , _smtName = Nothing
    , _smtOutputInfos = Nothing
    , _smtSystemName = Nothing
    , _smtStageName = Nothing
    , _smtUserFn = Nothing
    }

-- | Information about each of the inputs.
smtInputs :: Lens' SeqMapTask [SideInputInfo]
smtInputs
  = lens _smtInputs (\ s a -> s{_smtInputs = a}) .
      _Default
      . _Coerce

-- | The user-provided name of the SeqDo operation.
smtName :: Lens' SeqMapTask (Maybe Text)
smtName = lens _smtName (\ s a -> s{_smtName = a})

-- | Information about each of the outputs.
smtOutputInfos :: Lens' SeqMapTask [SeqMapTaskOutputInfo]
smtOutputInfos
  = lens _smtOutputInfos
      (\ s a -> s{_smtOutputInfos = a})
      . _Default
      . _Coerce

-- | System-defined name of the SeqDo operation. Unique across the workflow.
smtSystemName :: Lens' SeqMapTask (Maybe Text)
smtSystemName
  = lens _smtSystemName
      (\ s a -> s{_smtSystemName = a})

-- | System-defined name of the stage containing the SeqDo operation. Unique
-- across the workflow.
smtStageName :: Lens' SeqMapTask (Maybe Text)
smtStageName
  = lens _smtStageName (\ s a -> s{_smtStageName = a})

-- | The user function to invoke.
smtUserFn :: Lens' SeqMapTask (Maybe SeqMapTaskUserFn)
smtUserFn
  = lens _smtUserFn (\ s a -> s{_smtUserFn = a})

instance FromJSON SeqMapTask where
        parseJSON
          = withObject "SeqMapTask"
              (\ o ->
                 SeqMapTask' <$>
                   (o .:? "inputs" .!= mempty) <*> (o .:? "name") <*>
                     (o .:? "outputInfos" .!= mempty)
                     <*> (o .:? "systemName")
                     <*> (o .:? "stageName")
                     <*> (o .:? "userFn"))

instance ToJSON SeqMapTask where
        toJSON SeqMapTask'{..}
          = object
              (catMaybes
                 [("inputs" .=) <$> _smtInputs,
                  ("name" .=) <$> _smtName,
                  ("outputInfos" .=) <$> _smtOutputInfos,
                  ("systemName" .=) <$> _smtSystemName,
                  ("stageName" .=) <$> _smtStageName,
                  ("userFn" .=) <$> _smtUserFn])

-- | Map from user step names to state families.
--
-- /See:/ 'streamingConfigTaskUserStepToStateFamilyNameMap' smart constructor.
newtype StreamingConfigTaskUserStepToStateFamilyNameMap = StreamingConfigTaskUserStepToStateFamilyNameMap'
    { _sctustsfnmAddtional :: HashMap Text Text
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'StreamingConfigTaskUserStepToStateFamilyNameMap' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sctustsfnmAddtional'
streamingConfigTaskUserStepToStateFamilyNameMap
    :: HashMap Text Text -- ^ 'sctustsfnmAddtional'
    -> StreamingConfigTaskUserStepToStateFamilyNameMap
streamingConfigTaskUserStepToStateFamilyNameMap pSctustsfnmAddtional_ =
    StreamingConfigTaskUserStepToStateFamilyNameMap'
    { _sctustsfnmAddtional = _Coerce # pSctustsfnmAddtional_
    }

sctustsfnmAddtional :: Lens' StreamingConfigTaskUserStepToStateFamilyNameMap (HashMap Text Text)
sctustsfnmAddtional
  = lens _sctustsfnmAddtional
      (\ s a -> s{_sctustsfnmAddtional = a})
      . _Coerce

instance FromJSON
         StreamingConfigTaskUserStepToStateFamilyNameMap where
        parseJSON
          = withObject
              "StreamingConfigTaskUserStepToStateFamilyNameMap"
              (\ o ->
                 StreamingConfigTaskUserStepToStateFamilyNameMap' <$>
                   (parseJSONObject o))

instance ToJSON
         StreamingConfigTaskUserStepToStateFamilyNameMap where
        toJSON = toJSON . _sctustsfnmAddtional

-- | A work item that represents the different operations that can be
-- performed on a user-defined Source specification.
--
-- /See:/ 'sourceOperationRequest' smart constructor.
data SourceOperationRequest = SourceOperationRequest'
    { _sSplit       :: !(Maybe SourceSplitRequest)
    , _sGetMetadata :: !(Maybe SourceGetMetadataRequest)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'SourceOperationRequest' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'sSplit'
--
-- * 'sGetMetadata'
sourceOperationRequest
    :: SourceOperationRequest
sourceOperationRequest =
    SourceOperationRequest'
    { _sSplit = Nothing
    , _sGetMetadata = Nothing
    }

-- | Information about a request to split a source.
sSplit :: Lens' SourceOperationRequest (Maybe SourceSplitRequest)
sSplit = lens _sSplit (\ s a -> s{_sSplit = a})

-- | Information about a request to get metadata about a source.
sGetMetadata :: Lens' SourceOperationRequest (Maybe SourceGetMetadataRequest)
sGetMetadata
  = lens _sGetMetadata (\ s a -> s{_sGetMetadata = a})

instance FromJSON SourceOperationRequest where
        parseJSON
          = withObject "SourceOperationRequest"
              (\ o ->
                 SourceOperationRequest' <$>
                   (o .:? "split") <*> (o .:? "getMetadata"))

instance ToJSON SourceOperationRequest where
        toJSON SourceOperationRequest'{..}
          = object
              (catMaybes
                 [("split" .=) <$> _sSplit,
                  ("getMetadata" .=) <$> _sGetMetadata])

-- | Response to a request to lease WorkItems.
--
-- /See:/ 'leaseWorkItemResponse' smart constructor.
newtype LeaseWorkItemResponse = LeaseWorkItemResponse'
    { _lwirWorkItems :: Maybe [WorkItem]
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'LeaseWorkItemResponse' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'lwirWorkItems'
leaseWorkItemResponse
    :: LeaseWorkItemResponse
leaseWorkItemResponse =
    LeaseWorkItemResponse'
    { _lwirWorkItems = Nothing
    }

-- | A list of the leased WorkItems.
lwirWorkItems :: Lens' LeaseWorkItemResponse [WorkItem]
lwirWorkItems
  = lens _lwirWorkItems
      (\ s a -> s{_lwirWorkItems = a})
      . _Default
      . _Coerce

instance FromJSON LeaseWorkItemResponse where
        parseJSON
          = withObject "LeaseWorkItemResponse"
              (\ o ->
                 LeaseWorkItemResponse' <$>
                   (o .:? "workItems" .!= mempty))

instance ToJSON LeaseWorkItemResponse where
        toJSON LeaseWorkItemResponse'{..}
          = object
              (catMaybes [("workItems" .=) <$> _lwirWorkItems])

-- | Position defines a position within a collection of data. The value can
-- be either the end position, a key (used with ordered collections), a
-- byte offset, or a record index.
--
-- /See:/ 'position' smart constructor.
data Position = Position'
    { _pByteOffSet      :: !(Maybe (Textual Int64))
    , _pConcatPosition  :: !(Maybe ConcatPosition)
    , _pRecordIndex     :: !(Maybe (Textual Int64))
    , _pShufflePosition :: !(Maybe Text)
    , _pKey             :: !(Maybe Text)
    , _pEnd             :: !(Maybe Bool)
    } deriving (Eq,Show,Data,Typeable,Generic)

-- | Creates a value of 'Position' with the minimum fields required to make a request.
--
-- Use one of the following lenses to modify other fields as desired:
--
-- * 'pByteOffSet'
--
-- * 'pConcatPosition'
--
-- * 'pRecordIndex'
--
-- * 'pShufflePosition'
--
-- * 'pKey'
--
-- * 'pEnd'
position
    :: Position
position =
    Position'
    { _pByteOffSet = Nothing
    , _pConcatPosition = Nothing
    , _pRecordIndex = Nothing
    , _pShufflePosition = Nothing
    , _pKey = Nothing
    , _pEnd = Nothing
    }

-- | Position is a byte offset.
pByteOffSet :: Lens' Position (Maybe Int64)
pByteOffSet
  = lens _pByteOffSet (\ s a -> s{_pByteOffSet = a}) .
      mapping _Coerce

-- | CloudPosition is a concat position.
pConcatPosition :: Lens' Position (Maybe ConcatPosition)
pConcatPosition
  = lens _pConcatPosition
      (\ s a -> s{_pConcatPosition = a})

-- | Position is a record index.
pRecordIndex :: Lens' Position (Maybe Int64)
pRecordIndex
  = lens _pRecordIndex (\ s a -> s{_pRecordIndex = a})
      . mapping _Coerce

-- | CloudPosition is a base64 encoded BatchShufflePosition (with FIXED
-- sharding).
pShufflePosition :: Lens' Position (Maybe Text)
pShufflePosition
  = lens _pShufflePosition
      (\ s a -> s{_pShufflePosition = a})

-- | Position is a string key, ordered lexicographically.
pKey :: Lens' Position (Maybe Text)
pKey = lens _pKey (\ s a -> s{_pKey = a})

-- | Position is past all other positions. Also useful for the end position
-- of an unbounded range.
pEnd :: Lens' Position (Maybe Bool)
pEnd = lens _pEnd (\ s a -> s{_pEnd = a})

instance FromJSON Position where
        parseJSON
          = withObject "Position"
              (\ o ->
                 Position' <$>
                   (o .:? "byteOffset") <*> (o .:? "concatPosition") <*>
                     (o .:? "recordIndex")
                     <*> (o .:? "shufflePosition")
                     <*> (o .:? "key")
                     <*> (o .:? "end"))

instance ToJSON Position where
        toJSON Position'{..}
          = object
              (catMaybes
                 [("byteOffset" .=) <$> _pByteOffSet,
                  ("concatPosition" .=) <$> _pConcatPosition,
                  ("recordIndex" .=) <$> _pRecordIndex,
                  ("shufflePosition" .=) <$> _pShufflePosition,
                  ("key" .=) <$> _pKey, ("end" .=) <$> _pEnd])
