{-# 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.AppMesh.Types.GrpcRoute
-- 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.AppMesh.Types.GrpcRoute where

import Amazonka.AppMesh.Types.GrpcRetryPolicy
import Amazonka.AppMesh.Types.GrpcRouteAction
import Amazonka.AppMesh.Types.GrpcRouteMatch
import Amazonka.AppMesh.Types.GrpcTimeout
import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude

-- | An object that represents a gRPC route type.
--
-- /See:/ 'newGrpcRoute' smart constructor.
data GrpcRoute = GrpcRoute'
  { -- | An object that represents a retry policy.
    GrpcRoute -> Maybe GrpcRetryPolicy
retryPolicy :: Prelude.Maybe GrpcRetryPolicy,
    -- | An object that represents types of timeouts.
    GrpcRoute -> Maybe GrpcTimeout
timeout :: Prelude.Maybe GrpcTimeout,
    -- | An object that represents the action to take if a match is determined.
    GrpcRoute -> GrpcRouteAction
action :: GrpcRouteAction,
    -- | An object that represents the criteria for determining a request match.
    GrpcRoute -> GrpcRouteMatch
match :: GrpcRouteMatch
  }
  deriving (GrpcRoute -> GrpcRoute -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: GrpcRoute -> GrpcRoute -> Bool
$c/= :: GrpcRoute -> GrpcRoute -> Bool
== :: GrpcRoute -> GrpcRoute -> Bool
$c== :: GrpcRoute -> GrpcRoute -> Bool
Prelude.Eq, ReadPrec [GrpcRoute]
ReadPrec GrpcRoute
Int -> ReadS GrpcRoute
ReadS [GrpcRoute]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [GrpcRoute]
$creadListPrec :: ReadPrec [GrpcRoute]
readPrec :: ReadPrec GrpcRoute
$creadPrec :: ReadPrec GrpcRoute
readList :: ReadS [GrpcRoute]
$creadList :: ReadS [GrpcRoute]
readsPrec :: Int -> ReadS GrpcRoute
$creadsPrec :: Int -> ReadS GrpcRoute
Prelude.Read, Int -> GrpcRoute -> ShowS
[GrpcRoute] -> ShowS
GrpcRoute -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GrpcRoute] -> ShowS
$cshowList :: [GrpcRoute] -> ShowS
show :: GrpcRoute -> String
$cshow :: GrpcRoute -> String
showsPrec :: Int -> GrpcRoute -> ShowS
$cshowsPrec :: Int -> GrpcRoute -> ShowS
Prelude.Show, forall x. Rep GrpcRoute x -> GrpcRoute
forall x. GrpcRoute -> Rep GrpcRoute x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep GrpcRoute x -> GrpcRoute
$cfrom :: forall x. GrpcRoute -> Rep GrpcRoute x
Prelude.Generic)

-- |
-- Create a value of 'GrpcRoute' 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:
--
-- 'retryPolicy', 'grpcRoute_retryPolicy' - An object that represents a retry policy.
--
-- 'timeout', 'grpcRoute_timeout' - An object that represents types of timeouts.
--
-- 'action', 'grpcRoute_action' - An object that represents the action to take if a match is determined.
--
-- 'match', 'grpcRoute_match' - An object that represents the criteria for determining a request match.
newGrpcRoute ::
  -- | 'action'
  GrpcRouteAction ->
  -- | 'match'
  GrpcRouteMatch ->
  GrpcRoute
newGrpcRoute :: GrpcRouteAction -> GrpcRouteMatch -> GrpcRoute
newGrpcRoute GrpcRouteAction
pAction_ GrpcRouteMatch
pMatch_ =
  GrpcRoute'
    { $sel:retryPolicy:GrpcRoute' :: Maybe GrpcRetryPolicy
retryPolicy = forall a. Maybe a
Prelude.Nothing,
      $sel:timeout:GrpcRoute' :: Maybe GrpcTimeout
timeout = forall a. Maybe a
Prelude.Nothing,
      $sel:action:GrpcRoute' :: GrpcRouteAction
action = GrpcRouteAction
pAction_,
      $sel:match:GrpcRoute' :: GrpcRouteMatch
match = GrpcRouteMatch
pMatch_
    }

-- | An object that represents a retry policy.
grpcRoute_retryPolicy :: Lens.Lens' GrpcRoute (Prelude.Maybe GrpcRetryPolicy)
grpcRoute_retryPolicy :: Lens' GrpcRoute (Maybe GrpcRetryPolicy)
grpcRoute_retryPolicy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GrpcRoute' {Maybe GrpcRetryPolicy
retryPolicy :: Maybe GrpcRetryPolicy
$sel:retryPolicy:GrpcRoute' :: GrpcRoute -> Maybe GrpcRetryPolicy
retryPolicy} -> Maybe GrpcRetryPolicy
retryPolicy) (\s :: GrpcRoute
s@GrpcRoute' {} Maybe GrpcRetryPolicy
a -> GrpcRoute
s {$sel:retryPolicy:GrpcRoute' :: Maybe GrpcRetryPolicy
retryPolicy = Maybe GrpcRetryPolicy
a} :: GrpcRoute)

-- | An object that represents types of timeouts.
grpcRoute_timeout :: Lens.Lens' GrpcRoute (Prelude.Maybe GrpcTimeout)
grpcRoute_timeout :: Lens' GrpcRoute (Maybe GrpcTimeout)
grpcRoute_timeout = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GrpcRoute' {Maybe GrpcTimeout
timeout :: Maybe GrpcTimeout
$sel:timeout:GrpcRoute' :: GrpcRoute -> Maybe GrpcTimeout
timeout} -> Maybe GrpcTimeout
timeout) (\s :: GrpcRoute
s@GrpcRoute' {} Maybe GrpcTimeout
a -> GrpcRoute
s {$sel:timeout:GrpcRoute' :: Maybe GrpcTimeout
timeout = Maybe GrpcTimeout
a} :: GrpcRoute)

-- | An object that represents the action to take if a match is determined.
grpcRoute_action :: Lens.Lens' GrpcRoute GrpcRouteAction
grpcRoute_action :: Lens' GrpcRoute GrpcRouteAction
grpcRoute_action = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GrpcRoute' {GrpcRouteAction
action :: GrpcRouteAction
$sel:action:GrpcRoute' :: GrpcRoute -> GrpcRouteAction
action} -> GrpcRouteAction
action) (\s :: GrpcRoute
s@GrpcRoute' {} GrpcRouteAction
a -> GrpcRoute
s {$sel:action:GrpcRoute' :: GrpcRouteAction
action = GrpcRouteAction
a} :: GrpcRoute)

-- | An object that represents the criteria for determining a request match.
grpcRoute_match :: Lens.Lens' GrpcRoute GrpcRouteMatch
grpcRoute_match :: Lens' GrpcRoute GrpcRouteMatch
grpcRoute_match = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\GrpcRoute' {GrpcRouteMatch
match :: GrpcRouteMatch
$sel:match:GrpcRoute' :: GrpcRoute -> GrpcRouteMatch
match} -> GrpcRouteMatch
match) (\s :: GrpcRoute
s@GrpcRoute' {} GrpcRouteMatch
a -> GrpcRoute
s {$sel:match:GrpcRoute' :: GrpcRouteMatch
match = GrpcRouteMatch
a} :: GrpcRoute)

instance Data.FromJSON GrpcRoute where
  parseJSON :: Value -> Parser GrpcRoute
parseJSON =
    forall a. String -> (Object -> Parser a) -> Value -> Parser a
Data.withObject
      String
"GrpcRoute"
      ( \Object
x ->
          Maybe GrpcRetryPolicy
-> Maybe GrpcTimeout
-> GrpcRouteAction
-> GrpcRouteMatch
-> GrpcRoute
GrpcRoute'
            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
"retryPolicy")
            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
"timeout")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"action")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (Object
x forall a. FromJSON a => Object -> Key -> Parser a
Data..: Key
"match")
      )

instance Prelude.Hashable GrpcRoute where
  hashWithSalt :: Int -> GrpcRoute -> Int
hashWithSalt Int
_salt GrpcRoute' {Maybe GrpcTimeout
Maybe GrpcRetryPolicy
GrpcRouteMatch
GrpcRouteAction
match :: GrpcRouteMatch
action :: GrpcRouteAction
timeout :: Maybe GrpcTimeout
retryPolicy :: Maybe GrpcRetryPolicy
$sel:match:GrpcRoute' :: GrpcRoute -> GrpcRouteMatch
$sel:action:GrpcRoute' :: GrpcRoute -> GrpcRouteAction
$sel:timeout:GrpcRoute' :: GrpcRoute -> Maybe GrpcTimeout
$sel:retryPolicy:GrpcRoute' :: GrpcRoute -> Maybe GrpcRetryPolicy
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe GrpcRetryPolicy
retryPolicy
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe GrpcTimeout
timeout
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` GrpcRouteAction
action
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` GrpcRouteMatch
match

instance Prelude.NFData GrpcRoute where
  rnf :: GrpcRoute -> ()
rnf GrpcRoute' {Maybe GrpcTimeout
Maybe GrpcRetryPolicy
GrpcRouteMatch
GrpcRouteAction
match :: GrpcRouteMatch
action :: GrpcRouteAction
timeout :: Maybe GrpcTimeout
retryPolicy :: Maybe GrpcRetryPolicy
$sel:match:GrpcRoute' :: GrpcRoute -> GrpcRouteMatch
$sel:action:GrpcRoute' :: GrpcRoute -> GrpcRouteAction
$sel:timeout:GrpcRoute' :: GrpcRoute -> Maybe GrpcTimeout
$sel:retryPolicy:GrpcRoute' :: GrpcRoute -> Maybe GrpcRetryPolicy
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe GrpcRetryPolicy
retryPolicy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe GrpcTimeout
timeout
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf GrpcRouteAction
action
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf GrpcRouteMatch
match

instance Data.ToJSON GrpcRoute where
  toJSON :: GrpcRoute -> Value
toJSON GrpcRoute' {Maybe GrpcTimeout
Maybe GrpcRetryPolicy
GrpcRouteMatch
GrpcRouteAction
match :: GrpcRouteMatch
action :: GrpcRouteAction
timeout :: Maybe GrpcTimeout
retryPolicy :: Maybe GrpcRetryPolicy
$sel:match:GrpcRoute' :: GrpcRoute -> GrpcRouteMatch
$sel:action:GrpcRoute' :: GrpcRoute -> GrpcRouteAction
$sel:timeout:GrpcRoute' :: GrpcRoute -> Maybe GrpcTimeout
$sel:retryPolicy:GrpcRoute' :: GrpcRoute -> Maybe GrpcRetryPolicy
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"retryPolicy" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe GrpcRetryPolicy
retryPolicy,
            (Key
"timeout" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe GrpcTimeout
timeout,
            forall a. a -> Maybe a
Prelude.Just (Key
"action" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= GrpcRouteAction
action),
            forall a. a -> Maybe a
Prelude.Just (Key
"match" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= GrpcRouteMatch
match)
          ]
      )