{-# 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.Problem
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.DeviceFarm.Types.Problem where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import Amazonka.DeviceFarm.Types.Device
import Amazonka.DeviceFarm.Types.ExecutionResult
import Amazonka.DeviceFarm.Types.ProblemDetail
import qualified Amazonka.Prelude as Prelude

-- | Represents a specific warning or failure.
--
-- /See:/ 'newProblem' smart constructor.
data Problem = Problem'
  { -- | Information about the associated device.
    Problem -> Maybe Device
device :: Prelude.Maybe Device,
    -- | Information about the associated job.
    Problem -> Maybe ProblemDetail
job :: Prelude.Maybe ProblemDetail,
    -- | A message about the problem\'s result.
    Problem -> Maybe Text
message :: Prelude.Maybe Prelude.Text,
    -- | The problem\'s result.
    --
    -- Allowed values include:
    --
    -- -   PENDING
    --
    -- -   PASSED
    --
    -- -   WARNED
    --
    -- -   FAILED
    --
    -- -   SKIPPED
    --
    -- -   ERRORED
    --
    -- -   STOPPED
    Problem -> Maybe ExecutionResult
result :: Prelude.Maybe ExecutionResult,
    -- | Information about the associated run.
    Problem -> Maybe ProblemDetail
run :: Prelude.Maybe ProblemDetail,
    -- | Information about the associated suite.
    Problem -> Maybe ProblemDetail
suite :: Prelude.Maybe ProblemDetail,
    -- | Information about the associated test.
    Problem -> Maybe ProblemDetail
test :: Prelude.Maybe ProblemDetail
  }
  deriving (Problem -> Problem -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Problem -> Problem -> Bool
$c/= :: Problem -> Problem -> Bool
== :: Problem -> Problem -> Bool
$c== :: Problem -> Problem -> Bool
Prelude.Eq, ReadPrec [Problem]
ReadPrec Problem
Int -> ReadS Problem
ReadS [Problem]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Problem]
$creadListPrec :: ReadPrec [Problem]
readPrec :: ReadPrec Problem
$creadPrec :: ReadPrec Problem
readList :: ReadS [Problem]
$creadList :: ReadS [Problem]
readsPrec :: Int -> ReadS Problem
$creadsPrec :: Int -> ReadS Problem
Prelude.Read, Int -> Problem -> ShowS
[Problem] -> ShowS
Problem -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Problem] -> ShowS
$cshowList :: [Problem] -> ShowS
show :: Problem -> String
$cshow :: Problem -> String
showsPrec :: Int -> Problem -> ShowS
$cshowsPrec :: Int -> Problem -> ShowS
Prelude.Show, forall x. Rep Problem x -> Problem
forall x. Problem -> Rep Problem x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Problem x -> Problem
$cfrom :: forall x. Problem -> Rep Problem x
Prelude.Generic)

-- |
-- Create a value of 'Problem' 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:
--
-- 'device', 'problem_device' - Information about the associated device.
--
-- 'job', 'problem_job' - Information about the associated job.
--
-- 'message', 'problem_message' - A message about the problem\'s result.
--
-- 'result', 'problem_result' - The problem\'s result.
--
-- Allowed values include:
--
-- -   PENDING
--
-- -   PASSED
--
-- -   WARNED
--
-- -   FAILED
--
-- -   SKIPPED
--
-- -   ERRORED
--
-- -   STOPPED
--
-- 'run', 'problem_run' - Information about the associated run.
--
-- 'suite', 'problem_suite' - Information about the associated suite.
--
-- 'test', 'problem_test' - Information about the associated test.
newProblem ::
  Problem
newProblem :: Problem
newProblem =
  Problem'
    { $sel:device:Problem' :: Maybe Device
device = forall a. Maybe a
Prelude.Nothing,
      $sel:job:Problem' :: Maybe ProblemDetail
job = forall a. Maybe a
Prelude.Nothing,
      $sel:message:Problem' :: Maybe Text
message = forall a. Maybe a
Prelude.Nothing,
      $sel:result:Problem' :: Maybe ExecutionResult
result = forall a. Maybe a
Prelude.Nothing,
      $sel:run:Problem' :: Maybe ProblemDetail
run = forall a. Maybe a
Prelude.Nothing,
      $sel:suite:Problem' :: Maybe ProblemDetail
suite = forall a. Maybe a
Prelude.Nothing,
      $sel:test:Problem' :: Maybe ProblemDetail
test = forall a. Maybe a
Prelude.Nothing
    }

-- | Information about the associated device.
problem_device :: Lens.Lens' Problem (Prelude.Maybe Device)
problem_device :: Lens' Problem (Maybe Device)
problem_device = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Problem' {Maybe Device
device :: Maybe Device
$sel:device:Problem' :: Problem -> Maybe Device
device} -> Maybe Device
device) (\s :: Problem
s@Problem' {} Maybe Device
a -> Problem
s {$sel:device:Problem' :: Maybe Device
device = Maybe Device
a} :: Problem)

-- | Information about the associated job.
problem_job :: Lens.Lens' Problem (Prelude.Maybe ProblemDetail)
problem_job :: Lens' Problem (Maybe ProblemDetail)
problem_job = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Problem' {Maybe ProblemDetail
job :: Maybe ProblemDetail
$sel:job:Problem' :: Problem -> Maybe ProblemDetail
job} -> Maybe ProblemDetail
job) (\s :: Problem
s@Problem' {} Maybe ProblemDetail
a -> Problem
s {$sel:job:Problem' :: Maybe ProblemDetail
job = Maybe ProblemDetail
a} :: Problem)

-- | A message about the problem\'s result.
problem_message :: Lens.Lens' Problem (Prelude.Maybe Prelude.Text)
problem_message :: Lens' Problem (Maybe Text)
problem_message = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Problem' {Maybe Text
message :: Maybe Text
$sel:message:Problem' :: Problem -> Maybe Text
message} -> Maybe Text
message) (\s :: Problem
s@Problem' {} Maybe Text
a -> Problem
s {$sel:message:Problem' :: Maybe Text
message = Maybe Text
a} :: Problem)

-- | The problem\'s result.
--
-- Allowed values include:
--
-- -   PENDING
--
-- -   PASSED
--
-- -   WARNED
--
-- -   FAILED
--
-- -   SKIPPED
--
-- -   ERRORED
--
-- -   STOPPED
problem_result :: Lens.Lens' Problem (Prelude.Maybe ExecutionResult)
problem_result :: Lens' Problem (Maybe ExecutionResult)
problem_result = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Problem' {Maybe ExecutionResult
result :: Maybe ExecutionResult
$sel:result:Problem' :: Problem -> Maybe ExecutionResult
result} -> Maybe ExecutionResult
result) (\s :: Problem
s@Problem' {} Maybe ExecutionResult
a -> Problem
s {$sel:result:Problem' :: Maybe ExecutionResult
result = Maybe ExecutionResult
a} :: Problem)

-- | Information about the associated run.
problem_run :: Lens.Lens' Problem (Prelude.Maybe ProblemDetail)
problem_run :: Lens' Problem (Maybe ProblemDetail)
problem_run = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Problem' {Maybe ProblemDetail
run :: Maybe ProblemDetail
$sel:run:Problem' :: Problem -> Maybe ProblemDetail
run} -> Maybe ProblemDetail
run) (\s :: Problem
s@Problem' {} Maybe ProblemDetail
a -> Problem
s {$sel:run:Problem' :: Maybe ProblemDetail
run = Maybe ProblemDetail
a} :: Problem)

-- | Information about the associated suite.
problem_suite :: Lens.Lens' Problem (Prelude.Maybe ProblemDetail)
problem_suite :: Lens' Problem (Maybe ProblemDetail)
problem_suite = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Problem' {Maybe ProblemDetail
suite :: Maybe ProblemDetail
$sel:suite:Problem' :: Problem -> Maybe ProblemDetail
suite} -> Maybe ProblemDetail
suite) (\s :: Problem
s@Problem' {} Maybe ProblemDetail
a -> Problem
s {$sel:suite:Problem' :: Maybe ProblemDetail
suite = Maybe ProblemDetail
a} :: Problem)

-- | Information about the associated test.
problem_test :: Lens.Lens' Problem (Prelude.Maybe ProblemDetail)
problem_test :: Lens' Problem (Maybe ProblemDetail)
problem_test = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Problem' {Maybe ProblemDetail
test :: Maybe ProblemDetail
$sel:test:Problem' :: Problem -> Maybe ProblemDetail
test} -> Maybe ProblemDetail
test) (\s :: Problem
s@Problem' {} Maybe ProblemDetail
a -> Problem
s {$sel:test:Problem' :: Maybe ProblemDetail
test = Maybe ProblemDetail
a} :: Problem)

instance Data.FromJSON Problem where
  parseJSON :: Value -> Parser Problem
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"Problem"
      ( \Object
x ->
          Maybe Device
-> Maybe ProblemDetail
-> Maybe Text
-> Maybe ExecutionResult
-> Maybe ProblemDetail
-> Maybe ProblemDetail
-> Maybe ProblemDetail
-> Problem
Problem'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"device")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"job")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"message")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"result")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"run")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"suite")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
Data..:? Key
"test")
      )

instance Prelude.Hashable Problem where
  hashWithSalt :: Int -> Problem -> Int
hashWithSalt Int
_salt Problem' {Maybe Text
Maybe ExecutionResult
Maybe ProblemDetail
Maybe Device
test :: Maybe ProblemDetail
suite :: Maybe ProblemDetail
run :: Maybe ProblemDetail
result :: Maybe ExecutionResult
message :: Maybe Text
job :: Maybe ProblemDetail
device :: Maybe Device
$sel:test:Problem' :: Problem -> Maybe ProblemDetail
$sel:suite:Problem' :: Problem -> Maybe ProblemDetail
$sel:run:Problem' :: Problem -> Maybe ProblemDetail
$sel:result:Problem' :: Problem -> Maybe ExecutionResult
$sel:message:Problem' :: Problem -> Maybe Text
$sel:job:Problem' :: Problem -> Maybe ProblemDetail
$sel:device:Problem' :: Problem -> Maybe Device
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Device
device
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ProblemDetail
job
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Text
message
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ExecutionResult
result
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ProblemDetail
run
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ProblemDetail
suite
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ProblemDetail
test

instance Prelude.NFData Problem where
  rnf :: Problem -> ()
rnf Problem' {Maybe Text
Maybe ExecutionResult
Maybe ProblemDetail
Maybe Device
test :: Maybe ProblemDetail
suite :: Maybe ProblemDetail
run :: Maybe ProblemDetail
result :: Maybe ExecutionResult
message :: Maybe Text
job :: Maybe ProblemDetail
device :: Maybe Device
$sel:test:Problem' :: Problem -> Maybe ProblemDetail
$sel:suite:Problem' :: Problem -> Maybe ProblemDetail
$sel:run:Problem' :: Problem -> Maybe ProblemDetail
$sel:result:Problem' :: Problem -> Maybe ExecutionResult
$sel:message:Problem' :: Problem -> Maybe Text
$sel:job:Problem' :: Problem -> Maybe ProblemDetail
$sel:device:Problem' :: Problem -> Maybe Device
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Device
device
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ProblemDetail
job
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
message
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ExecutionResult
result
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ProblemDetail
run
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ProblemDetail
suite
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ProblemDetail
test