{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.DeviceFarm.Types.DeviceSelectionConfiguration
-- Copyright   : (c) 2013-2021 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+amazonka@gmail.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.DeviceFarm.Types.DeviceSelectionConfiguration where

import qualified Amazonka.Core as Core
import Amazonka.DeviceFarm.Types.DeviceFilter
import qualified Amazonka.Lens as Lens
import qualified Amazonka.Prelude as Prelude

-- | Represents the device filters used in a test run and the maximum number
-- of devices to be included in the run. It is passed in as the
-- @deviceSelectionConfiguration@ request parameter in ScheduleRun.
--
-- /See:/ 'newDeviceSelectionConfiguration' smart constructor.
data DeviceSelectionConfiguration = DeviceSelectionConfiguration'
  { -- | Used to dynamically select a set of devices for a test run. A filter is
    -- made up of an attribute, an operator, and one or more values.
    --
    -- -   __Attribute__
    --
    --     The aspect of a device such as platform or model used as the
    --     selection criteria in a device filter.
    --
    --     Allowed values include:
    --
    --     -   ARN: The Amazon Resource Name (ARN) of the device (for example,
    --         @arn:aws:devicefarm:us-west-2::device:12345Example@).
    --
    --     -   PLATFORM: The device platform. Valid values are ANDROID or IOS.
    --
    --     -   OS_VERSION: The operating system version (for example, 10.3.2).
    --
    --     -   MODEL: The device model (for example, iPad 5th Gen).
    --
    --     -   AVAILABILITY: The current availability of the device. Valid
    --         values are AVAILABLE, HIGHLY_AVAILABLE, BUSY, or
    --         TEMPORARY_NOT_AVAILABLE.
    --
    --     -   FORM_FACTOR: The device form factor. Valid values are PHONE or
    --         TABLET.
    --
    --     -   MANUFACTURER: The device manufacturer (for example, Apple).
    --
    --     -   REMOTE_ACCESS_ENABLED: Whether the device is enabled for remote
    --         access. Valid values are TRUE or FALSE.
    --
    --     -   REMOTE_DEBUG_ENABLED: Whether the device is enabled for remote
    --         debugging. Valid values are TRUE or FALSE. Because remote
    --         debugging is
    --         <https://docs.aws.amazon.com/devicefarm/latest/developerguide/history.html no longer supported>,
    --         this filter is ignored.
    --
    --     -   INSTANCE_ARN: The Amazon Resource Name (ARN) of the device
    --         instance.
    --
    --     -   INSTANCE_LABELS: The label of the device instance.
    --
    --     -   FLEET_TYPE: The fleet type. Valid values are PUBLIC or PRIVATE.
    --
    -- -   __Operator__
    --
    --     The filter operator.
    --
    --     -   The EQUALS operator is available for every attribute except
    --         INSTANCE_LABELS.
    --
    --     -   The CONTAINS operator is available for the INSTANCE_LABELS and
    --         MODEL attributes.
    --
    --     -   The IN and NOT_IN operators are available for the ARN,
    --         OS_VERSION, MODEL, MANUFACTURER, and INSTANCE_ARN attributes.
    --
    --     -   The LESS_THAN, GREATER_THAN, LESS_THAN_OR_EQUALS, and
    --         GREATER_THAN_OR_EQUALS operators are also available for the
    --         OS_VERSION attribute.
    --
    -- -   __Values__
    --
    --     An array of one or more filter values.
    --
    --     __Operator Values__
    --
    --     -   The IN and NOT_IN operators can take a values array that has
    --         more than one element.
    --
    --     -   The other operators require an array with a single element.
    --
    --     __Attribute Values__
    --
    --     -   The PLATFORM attribute can be set to ANDROID or IOS.
    --
    --     -   The AVAILABILITY attribute can be set to AVAILABLE,
    --         HIGHLY_AVAILABLE, BUSY, or TEMPORARY_NOT_AVAILABLE.
    --
    --     -   The FORM_FACTOR attribute can be set to PHONE or TABLET.
    --
    --     -   The FLEET_TYPE attribute can be set to PUBLIC or PRIVATE.
    DeviceSelectionConfiguration -> [DeviceFilter]
filters :: [DeviceFilter],
    -- | The maximum number of devices to be included in a test run.
    DeviceSelectionConfiguration -> Int
maxDevices :: Prelude.Int
  }
  deriving (DeviceSelectionConfiguration
-> DeviceSelectionConfiguration -> Bool
(DeviceSelectionConfiguration
 -> DeviceSelectionConfiguration -> Bool)
-> (DeviceSelectionConfiguration
    -> DeviceSelectionConfiguration -> Bool)
-> Eq DeviceSelectionConfiguration
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DeviceSelectionConfiguration
-> DeviceSelectionConfiguration -> Bool
$c/= :: DeviceSelectionConfiguration
-> DeviceSelectionConfiguration -> Bool
== :: DeviceSelectionConfiguration
-> DeviceSelectionConfiguration -> Bool
$c== :: DeviceSelectionConfiguration
-> DeviceSelectionConfiguration -> Bool
Prelude.Eq, ReadPrec [DeviceSelectionConfiguration]
ReadPrec DeviceSelectionConfiguration
Int -> ReadS DeviceSelectionConfiguration
ReadS [DeviceSelectionConfiguration]
(Int -> ReadS DeviceSelectionConfiguration)
-> ReadS [DeviceSelectionConfiguration]
-> ReadPrec DeviceSelectionConfiguration
-> ReadPrec [DeviceSelectionConfiguration]
-> Read DeviceSelectionConfiguration
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DeviceSelectionConfiguration]
$creadListPrec :: ReadPrec [DeviceSelectionConfiguration]
readPrec :: ReadPrec DeviceSelectionConfiguration
$creadPrec :: ReadPrec DeviceSelectionConfiguration
readList :: ReadS [DeviceSelectionConfiguration]
$creadList :: ReadS [DeviceSelectionConfiguration]
readsPrec :: Int -> ReadS DeviceSelectionConfiguration
$creadsPrec :: Int -> ReadS DeviceSelectionConfiguration
Prelude.Read, Int -> DeviceSelectionConfiguration -> ShowS
[DeviceSelectionConfiguration] -> ShowS
DeviceSelectionConfiguration -> String
(Int -> DeviceSelectionConfiguration -> ShowS)
-> (DeviceSelectionConfiguration -> String)
-> ([DeviceSelectionConfiguration] -> ShowS)
-> Show DeviceSelectionConfiguration
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DeviceSelectionConfiguration] -> ShowS
$cshowList :: [DeviceSelectionConfiguration] -> ShowS
show :: DeviceSelectionConfiguration -> String
$cshow :: DeviceSelectionConfiguration -> String
showsPrec :: Int -> DeviceSelectionConfiguration -> ShowS
$cshowsPrec :: Int -> DeviceSelectionConfiguration -> ShowS
Prelude.Show, (forall x.
 DeviceSelectionConfiguration -> Rep DeviceSelectionConfiguration x)
-> (forall x.
    Rep DeviceSelectionConfiguration x -> DeviceSelectionConfiguration)
-> Generic DeviceSelectionConfiguration
forall x.
Rep DeviceSelectionConfiguration x -> DeviceSelectionConfiguration
forall x.
DeviceSelectionConfiguration -> Rep DeviceSelectionConfiguration x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep DeviceSelectionConfiguration x -> DeviceSelectionConfiguration
$cfrom :: forall x.
DeviceSelectionConfiguration -> Rep DeviceSelectionConfiguration x
Prelude.Generic)

-- |
-- Create a value of 'DeviceSelectionConfiguration' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'filters', 'deviceSelectionConfiguration_filters' - Used to dynamically select a set of devices for a test run. A filter is
-- made up of an attribute, an operator, and one or more values.
--
-- -   __Attribute__
--
--     The aspect of a device such as platform or model used as the
--     selection criteria in a device filter.
--
--     Allowed values include:
--
--     -   ARN: The Amazon Resource Name (ARN) of the device (for example,
--         @arn:aws:devicefarm:us-west-2::device:12345Example@).
--
--     -   PLATFORM: The device platform. Valid values are ANDROID or IOS.
--
--     -   OS_VERSION: The operating system version (for example, 10.3.2).
--
--     -   MODEL: The device model (for example, iPad 5th Gen).
--
--     -   AVAILABILITY: The current availability of the device. Valid
--         values are AVAILABLE, HIGHLY_AVAILABLE, BUSY, or
--         TEMPORARY_NOT_AVAILABLE.
--
--     -   FORM_FACTOR: The device form factor. Valid values are PHONE or
--         TABLET.
--
--     -   MANUFACTURER: The device manufacturer (for example, Apple).
--
--     -   REMOTE_ACCESS_ENABLED: Whether the device is enabled for remote
--         access. Valid values are TRUE or FALSE.
--
--     -   REMOTE_DEBUG_ENABLED: Whether the device is enabled for remote
--         debugging. Valid values are TRUE or FALSE. Because remote
--         debugging is
--         <https://docs.aws.amazon.com/devicefarm/latest/developerguide/history.html no longer supported>,
--         this filter is ignored.
--
--     -   INSTANCE_ARN: The Amazon Resource Name (ARN) of the device
--         instance.
--
--     -   INSTANCE_LABELS: The label of the device instance.
--
--     -   FLEET_TYPE: The fleet type. Valid values are PUBLIC or PRIVATE.
--
-- -   __Operator__
--
--     The filter operator.
--
--     -   The EQUALS operator is available for every attribute except
--         INSTANCE_LABELS.
--
--     -   The CONTAINS operator is available for the INSTANCE_LABELS and
--         MODEL attributes.
--
--     -   The IN and NOT_IN operators are available for the ARN,
--         OS_VERSION, MODEL, MANUFACTURER, and INSTANCE_ARN attributes.
--
--     -   The LESS_THAN, GREATER_THAN, LESS_THAN_OR_EQUALS, and
--         GREATER_THAN_OR_EQUALS operators are also available for the
--         OS_VERSION attribute.
--
-- -   __Values__
--
--     An array of one or more filter values.
--
--     __Operator Values__
--
--     -   The IN and NOT_IN operators can take a values array that has
--         more than one element.
--
--     -   The other operators require an array with a single element.
--
--     __Attribute Values__
--
--     -   The PLATFORM attribute can be set to ANDROID or IOS.
--
--     -   The AVAILABILITY attribute can be set to AVAILABLE,
--         HIGHLY_AVAILABLE, BUSY, or TEMPORARY_NOT_AVAILABLE.
--
--     -   The FORM_FACTOR attribute can be set to PHONE or TABLET.
--
--     -   The FLEET_TYPE attribute can be set to PUBLIC or PRIVATE.
--
-- 'maxDevices', 'deviceSelectionConfiguration_maxDevices' - The maximum number of devices to be included in a test run.
newDeviceSelectionConfiguration ::
  -- | 'maxDevices'
  Prelude.Int ->
  DeviceSelectionConfiguration
newDeviceSelectionConfiguration :: Int -> DeviceSelectionConfiguration
newDeviceSelectionConfiguration Int
pMaxDevices_ =
  DeviceSelectionConfiguration' :: [DeviceFilter] -> Int -> DeviceSelectionConfiguration
DeviceSelectionConfiguration'
    { $sel:filters:DeviceSelectionConfiguration' :: [DeviceFilter]
filters =
        [DeviceFilter]
forall a. Monoid a => a
Prelude.mempty,
      $sel:maxDevices:DeviceSelectionConfiguration' :: Int
maxDevices = Int
pMaxDevices_
    }

-- | Used to dynamically select a set of devices for a test run. A filter is
-- made up of an attribute, an operator, and one or more values.
--
-- -   __Attribute__
--
--     The aspect of a device such as platform or model used as the
--     selection criteria in a device filter.
--
--     Allowed values include:
--
--     -   ARN: The Amazon Resource Name (ARN) of the device (for example,
--         @arn:aws:devicefarm:us-west-2::device:12345Example@).
--
--     -   PLATFORM: The device platform. Valid values are ANDROID or IOS.
--
--     -   OS_VERSION: The operating system version (for example, 10.3.2).
--
--     -   MODEL: The device model (for example, iPad 5th Gen).
--
--     -   AVAILABILITY: The current availability of the device. Valid
--         values are AVAILABLE, HIGHLY_AVAILABLE, BUSY, or
--         TEMPORARY_NOT_AVAILABLE.
--
--     -   FORM_FACTOR: The device form factor. Valid values are PHONE or
--         TABLET.
--
--     -   MANUFACTURER: The device manufacturer (for example, Apple).
--
--     -   REMOTE_ACCESS_ENABLED: Whether the device is enabled for remote
--         access. Valid values are TRUE or FALSE.
--
--     -   REMOTE_DEBUG_ENABLED: Whether the device is enabled for remote
--         debugging. Valid values are TRUE or FALSE. Because remote
--         debugging is
--         <https://docs.aws.amazon.com/devicefarm/latest/developerguide/history.html no longer supported>,
--         this filter is ignored.
--
--     -   INSTANCE_ARN: The Amazon Resource Name (ARN) of the device
--         instance.
--
--     -   INSTANCE_LABELS: The label of the device instance.
--
--     -   FLEET_TYPE: The fleet type. Valid values are PUBLIC or PRIVATE.
--
-- -   __Operator__
--
--     The filter operator.
--
--     -   The EQUALS operator is available for every attribute except
--         INSTANCE_LABELS.
--
--     -   The CONTAINS operator is available for the INSTANCE_LABELS and
--         MODEL attributes.
--
--     -   The IN and NOT_IN operators are available for the ARN,
--         OS_VERSION, MODEL, MANUFACTURER, and INSTANCE_ARN attributes.
--
--     -   The LESS_THAN, GREATER_THAN, LESS_THAN_OR_EQUALS, and
--         GREATER_THAN_OR_EQUALS operators are also available for the
--         OS_VERSION attribute.
--
-- -   __Values__
--
--     An array of one or more filter values.
--
--     __Operator Values__
--
--     -   The IN and NOT_IN operators can take a values array that has
--         more than one element.
--
--     -   The other operators require an array with a single element.
--
--     __Attribute Values__
--
--     -   The PLATFORM attribute can be set to ANDROID or IOS.
--
--     -   The AVAILABILITY attribute can be set to AVAILABLE,
--         HIGHLY_AVAILABLE, BUSY, or TEMPORARY_NOT_AVAILABLE.
--
--     -   The FORM_FACTOR attribute can be set to PHONE or TABLET.
--
--     -   The FLEET_TYPE attribute can be set to PUBLIC or PRIVATE.
deviceSelectionConfiguration_filters :: Lens.Lens' DeviceSelectionConfiguration [DeviceFilter]
deviceSelectionConfiguration_filters :: ([DeviceFilter] -> f [DeviceFilter])
-> DeviceSelectionConfiguration -> f DeviceSelectionConfiguration
deviceSelectionConfiguration_filters = (DeviceSelectionConfiguration -> [DeviceFilter])
-> (DeviceSelectionConfiguration
    -> [DeviceFilter] -> DeviceSelectionConfiguration)
-> Lens
     DeviceSelectionConfiguration
     DeviceSelectionConfiguration
     [DeviceFilter]
     [DeviceFilter]
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeviceSelectionConfiguration' {[DeviceFilter]
filters :: [DeviceFilter]
$sel:filters:DeviceSelectionConfiguration' :: DeviceSelectionConfiguration -> [DeviceFilter]
filters} -> [DeviceFilter]
filters) (\s :: DeviceSelectionConfiguration
s@DeviceSelectionConfiguration' {} [DeviceFilter]
a -> DeviceSelectionConfiguration
s {$sel:filters:DeviceSelectionConfiguration' :: [DeviceFilter]
filters = [DeviceFilter]
a} :: DeviceSelectionConfiguration) (([DeviceFilter] -> f [DeviceFilter])
 -> DeviceSelectionConfiguration -> f DeviceSelectionConfiguration)
-> (([DeviceFilter] -> f [DeviceFilter])
    -> [DeviceFilter] -> f [DeviceFilter])
-> ([DeviceFilter] -> f [DeviceFilter])
-> DeviceSelectionConfiguration
-> f DeviceSelectionConfiguration
forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. ([DeviceFilter] -> f [DeviceFilter])
-> [DeviceFilter] -> f [DeviceFilter]
forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The maximum number of devices to be included in a test run.
deviceSelectionConfiguration_maxDevices :: Lens.Lens' DeviceSelectionConfiguration Prelude.Int
deviceSelectionConfiguration_maxDevices :: (Int -> f Int)
-> DeviceSelectionConfiguration -> f DeviceSelectionConfiguration
deviceSelectionConfiguration_maxDevices = (DeviceSelectionConfiguration -> Int)
-> (DeviceSelectionConfiguration
    -> Int -> DeviceSelectionConfiguration)
-> Lens
     DeviceSelectionConfiguration DeviceSelectionConfiguration Int Int
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DeviceSelectionConfiguration' {Int
maxDevices :: Int
$sel:maxDevices:DeviceSelectionConfiguration' :: DeviceSelectionConfiguration -> Int
maxDevices} -> Int
maxDevices) (\s :: DeviceSelectionConfiguration
s@DeviceSelectionConfiguration' {} Int
a -> DeviceSelectionConfiguration
s {$sel:maxDevices:DeviceSelectionConfiguration' :: Int
maxDevices = Int
a} :: DeviceSelectionConfiguration)

instance
  Prelude.Hashable
    DeviceSelectionConfiguration

instance Prelude.NFData DeviceSelectionConfiguration

instance Core.ToJSON DeviceSelectionConfiguration where
  toJSON :: DeviceSelectionConfiguration -> Value
toJSON DeviceSelectionConfiguration' {Int
[DeviceFilter]
maxDevices :: Int
filters :: [DeviceFilter]
$sel:maxDevices:DeviceSelectionConfiguration' :: DeviceSelectionConfiguration -> Int
$sel:filters:DeviceSelectionConfiguration' :: DeviceSelectionConfiguration -> [DeviceFilter]
..} =
    [Pair] -> Value
Core.object
      ( [Maybe Pair] -> [Pair]
forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"filters" Text -> [DeviceFilter] -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= [DeviceFilter]
filters),
            Pair -> Maybe Pair
forall a. a -> Maybe a
Prelude.Just (Text
"maxDevices" Text -> Int -> Pair
forall kv v. (KeyValue kv, ToJSON v) => Text -> v -> kv
Core..= Int
maxDevices)
          ]
      )