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

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

-- |
-- Module      : Amazonka.CloudWatchLogs.TestMetricFilter
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Tests the filter pattern of a metric filter against a sample of log
-- event messages. You can use this operation to validate the correctness
-- of a metric filter pattern.
module Amazonka.CloudWatchLogs.TestMetricFilter
  ( -- * Creating a Request
    TestMetricFilter (..),
    newTestMetricFilter,

    -- * Request Lenses
    testMetricFilter_filterPattern,
    testMetricFilter_logEventMessages,

    -- * Destructuring the Response
    TestMetricFilterResponse (..),
    newTestMetricFilterResponse,

    -- * Response Lenses
    testMetricFilterResponse_matches,
    testMetricFilterResponse_httpStatus,
  )
where

import Amazonka.CloudWatchLogs.Types
import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude
import qualified Amazonka.Request as Request
import qualified Amazonka.Response as Response

-- | /See:/ 'newTestMetricFilter' smart constructor.
data TestMetricFilter = TestMetricFilter'
  { TestMetricFilter -> Text
filterPattern :: Prelude.Text,
    -- | The log event messages to test.
    TestMetricFilter -> NonEmpty Text
logEventMessages :: Prelude.NonEmpty Prelude.Text
  }
  deriving (TestMetricFilter -> TestMetricFilter -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TestMetricFilter -> TestMetricFilter -> Bool
$c/= :: TestMetricFilter -> TestMetricFilter -> Bool
== :: TestMetricFilter -> TestMetricFilter -> Bool
$c== :: TestMetricFilter -> TestMetricFilter -> Bool
Prelude.Eq, ReadPrec [TestMetricFilter]
ReadPrec TestMetricFilter
Int -> ReadS TestMetricFilter
ReadS [TestMetricFilter]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [TestMetricFilter]
$creadListPrec :: ReadPrec [TestMetricFilter]
readPrec :: ReadPrec TestMetricFilter
$creadPrec :: ReadPrec TestMetricFilter
readList :: ReadS [TestMetricFilter]
$creadList :: ReadS [TestMetricFilter]
readsPrec :: Int -> ReadS TestMetricFilter
$creadsPrec :: Int -> ReadS TestMetricFilter
Prelude.Read, Int -> TestMetricFilter -> ShowS
[TestMetricFilter] -> ShowS
TestMetricFilter -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TestMetricFilter] -> ShowS
$cshowList :: [TestMetricFilter] -> ShowS
show :: TestMetricFilter -> String
$cshow :: TestMetricFilter -> String
showsPrec :: Int -> TestMetricFilter -> ShowS
$cshowsPrec :: Int -> TestMetricFilter -> ShowS
Prelude.Show, forall x. Rep TestMetricFilter x -> TestMetricFilter
forall x. TestMetricFilter -> Rep TestMetricFilter x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep TestMetricFilter x -> TestMetricFilter
$cfrom :: forall x. TestMetricFilter -> Rep TestMetricFilter x
Prelude.Generic)

-- |
-- Create a value of 'TestMetricFilter' 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:
--
-- 'filterPattern', 'testMetricFilter_filterPattern' - Undocumented member.
--
-- 'logEventMessages', 'testMetricFilter_logEventMessages' - The log event messages to test.
newTestMetricFilter ::
  -- | 'filterPattern'
  Prelude.Text ->
  -- | 'logEventMessages'
  Prelude.NonEmpty Prelude.Text ->
  TestMetricFilter
newTestMetricFilter :: Text -> NonEmpty Text -> TestMetricFilter
newTestMetricFilter
  Text
pFilterPattern_
  NonEmpty Text
pLogEventMessages_ =
    TestMetricFilter'
      { $sel:filterPattern:TestMetricFilter' :: Text
filterPattern = Text
pFilterPattern_,
        $sel:logEventMessages:TestMetricFilter' :: NonEmpty Text
logEventMessages =
          forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced forall t b. AReview t b -> b -> t
Lens.# NonEmpty Text
pLogEventMessages_
      }

-- | Undocumented member.
testMetricFilter_filterPattern :: Lens.Lens' TestMetricFilter Prelude.Text
testMetricFilter_filterPattern :: Lens' TestMetricFilter Text
testMetricFilter_filterPattern = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TestMetricFilter' {Text
filterPattern :: Text
$sel:filterPattern:TestMetricFilter' :: TestMetricFilter -> Text
filterPattern} -> Text
filterPattern) (\s :: TestMetricFilter
s@TestMetricFilter' {} Text
a -> TestMetricFilter
s {$sel:filterPattern:TestMetricFilter' :: Text
filterPattern = Text
a} :: TestMetricFilter)

-- | The log event messages to test.
testMetricFilter_logEventMessages :: Lens.Lens' TestMetricFilter (Prelude.NonEmpty Prelude.Text)
testMetricFilter_logEventMessages :: Lens' TestMetricFilter (NonEmpty Text)
testMetricFilter_logEventMessages = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TestMetricFilter' {NonEmpty Text
logEventMessages :: NonEmpty Text
$sel:logEventMessages:TestMetricFilter' :: TestMetricFilter -> NonEmpty Text
logEventMessages} -> NonEmpty Text
logEventMessages) (\s :: TestMetricFilter
s@TestMetricFilter' {} NonEmpty Text
a -> TestMetricFilter
s {$sel:logEventMessages:TestMetricFilter' :: NonEmpty Text
logEventMessages = NonEmpty Text
a} :: TestMetricFilter) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

instance Core.AWSRequest TestMetricFilter where
  type
    AWSResponse TestMetricFilter =
      TestMetricFilterResponse
  request :: (Service -> Service)
-> TestMetricFilter -> Request TestMetricFilter
request Service -> Service
overrides =
    forall a. (ToRequest a, ToJSON a) => Service -> a -> Request a
Request.postJSON (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy TestMetricFilter
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse TestMetricFilter)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> Object -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveJSON
      ( \Int
s ResponseHeaders
h Object
x ->
          Maybe [MetricFilterMatchRecord] -> Int -> TestMetricFilterResponse
TestMetricFilterResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (Object
x forall a. FromJSON a => Object -> Key -> Either String (Maybe a)
Data..?> Key
"matches" forall (f :: * -> *) a. Functor f => f (Maybe a) -> a -> f a
Core..!@ forall a. Monoid a => a
Prelude.mempty)
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (forall (f :: * -> *) a. Applicative f => a -> f a
Prelude.pure (forall a. Enum a => a -> Int
Prelude.fromEnum Int
s))
      )

instance Prelude.Hashable TestMetricFilter where
  hashWithSalt :: Int -> TestMetricFilter -> Int
hashWithSalt Int
_salt TestMetricFilter' {NonEmpty Text
Text
logEventMessages :: NonEmpty Text
filterPattern :: Text
$sel:logEventMessages:TestMetricFilter' :: TestMetricFilter -> NonEmpty Text
$sel:filterPattern:TestMetricFilter' :: TestMetricFilter -> Text
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
filterPattern
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` NonEmpty Text
logEventMessages

instance Prelude.NFData TestMetricFilter where
  rnf :: TestMetricFilter -> ()
rnf TestMetricFilter' {NonEmpty Text
Text
logEventMessages :: NonEmpty Text
filterPattern :: Text
$sel:logEventMessages:TestMetricFilter' :: TestMetricFilter -> NonEmpty Text
$sel:filterPattern:TestMetricFilter' :: TestMetricFilter -> Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Text
filterPattern
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf NonEmpty Text
logEventMessages

instance Data.ToHeaders TestMetricFilter where
  toHeaders :: TestMetricFilter -> ResponseHeaders
toHeaders =
    forall a b. a -> b -> a
Prelude.const
      ( forall a. Monoid a => [a] -> a
Prelude.mconcat
          [ HeaderName
"X-Amz-Target"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"Logs_20140328.TestMetricFilter" ::
                          Prelude.ByteString
                      ),
            HeaderName
"Content-Type"
              forall a. ToHeader a => HeaderName -> a -> ResponseHeaders
Data.=# ( ByteString
"application/x-amz-json-1.1" ::
                          Prelude.ByteString
                      )
          ]
      )

instance Data.ToJSON TestMetricFilter where
  toJSON :: TestMetricFilter -> Value
toJSON TestMetricFilter' {NonEmpty Text
Text
logEventMessages :: NonEmpty Text
filterPattern :: Text
$sel:logEventMessages:TestMetricFilter' :: TestMetricFilter -> NonEmpty Text
$sel:filterPattern:TestMetricFilter' :: TestMetricFilter -> Text
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ forall a. a -> Maybe a
Prelude.Just
              (Key
"filterPattern" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
filterPattern),
            forall a. a -> Maybe a
Prelude.Just
              (Key
"logEventMessages" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= NonEmpty Text
logEventMessages)
          ]
      )

instance Data.ToPath TestMetricFilter where
  toPath :: TestMetricFilter -> ByteString
toPath = forall a b. a -> b -> a
Prelude.const ByteString
"/"

instance Data.ToQuery TestMetricFilter where
  toQuery :: TestMetricFilter -> QueryString
toQuery = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

-- | /See:/ 'newTestMetricFilterResponse' smart constructor.
data TestMetricFilterResponse = TestMetricFilterResponse'
  { -- | The matched events.
    TestMetricFilterResponse -> Maybe [MetricFilterMatchRecord]
matches :: Prelude.Maybe [MetricFilterMatchRecord],
    -- | The response's http status code.
    TestMetricFilterResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (TestMetricFilterResponse -> TestMetricFilterResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: TestMetricFilterResponse -> TestMetricFilterResponse -> Bool
$c/= :: TestMetricFilterResponse -> TestMetricFilterResponse -> Bool
== :: TestMetricFilterResponse -> TestMetricFilterResponse -> Bool
$c== :: TestMetricFilterResponse -> TestMetricFilterResponse -> Bool
Prelude.Eq, ReadPrec [TestMetricFilterResponse]
ReadPrec TestMetricFilterResponse
Int -> ReadS TestMetricFilterResponse
ReadS [TestMetricFilterResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [TestMetricFilterResponse]
$creadListPrec :: ReadPrec [TestMetricFilterResponse]
readPrec :: ReadPrec TestMetricFilterResponse
$creadPrec :: ReadPrec TestMetricFilterResponse
readList :: ReadS [TestMetricFilterResponse]
$creadList :: ReadS [TestMetricFilterResponse]
readsPrec :: Int -> ReadS TestMetricFilterResponse
$creadsPrec :: Int -> ReadS TestMetricFilterResponse
Prelude.Read, Int -> TestMetricFilterResponse -> ShowS
[TestMetricFilterResponse] -> ShowS
TestMetricFilterResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TestMetricFilterResponse] -> ShowS
$cshowList :: [TestMetricFilterResponse] -> ShowS
show :: TestMetricFilterResponse -> String
$cshow :: TestMetricFilterResponse -> String
showsPrec :: Int -> TestMetricFilterResponse -> ShowS
$cshowsPrec :: Int -> TestMetricFilterResponse -> ShowS
Prelude.Show, forall x.
Rep TestMetricFilterResponse x -> TestMetricFilterResponse
forall x.
TestMetricFilterResponse -> Rep TestMetricFilterResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x.
Rep TestMetricFilterResponse x -> TestMetricFilterResponse
$cfrom :: forall x.
TestMetricFilterResponse -> Rep TestMetricFilterResponse x
Prelude.Generic)

-- |
-- Create a value of 'TestMetricFilterResponse' 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:
--
-- 'matches', 'testMetricFilterResponse_matches' - The matched events.
--
-- 'httpStatus', 'testMetricFilterResponse_httpStatus' - The response's http status code.
newTestMetricFilterResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  TestMetricFilterResponse
newTestMetricFilterResponse :: Int -> TestMetricFilterResponse
newTestMetricFilterResponse Int
pHttpStatus_ =
  TestMetricFilterResponse'
    { $sel:matches:TestMetricFilterResponse' :: Maybe [MetricFilterMatchRecord]
matches =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:TestMetricFilterResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The matched events.
testMetricFilterResponse_matches :: Lens.Lens' TestMetricFilterResponse (Prelude.Maybe [MetricFilterMatchRecord])
testMetricFilterResponse_matches :: Lens' TestMetricFilterResponse (Maybe [MetricFilterMatchRecord])
testMetricFilterResponse_matches = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TestMetricFilterResponse' {Maybe [MetricFilterMatchRecord]
matches :: Maybe [MetricFilterMatchRecord]
$sel:matches:TestMetricFilterResponse' :: TestMetricFilterResponse -> Maybe [MetricFilterMatchRecord]
matches} -> Maybe [MetricFilterMatchRecord]
matches) (\s :: TestMetricFilterResponse
s@TestMetricFilterResponse' {} Maybe [MetricFilterMatchRecord]
a -> TestMetricFilterResponse
s {$sel:matches:TestMetricFilterResponse' :: Maybe [MetricFilterMatchRecord]
matches = Maybe [MetricFilterMatchRecord]
a} :: TestMetricFilterResponse) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | The response's http status code.
testMetricFilterResponse_httpStatus :: Lens.Lens' TestMetricFilterResponse Prelude.Int
testMetricFilterResponse_httpStatus :: Lens' TestMetricFilterResponse Int
testMetricFilterResponse_httpStatus = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\TestMetricFilterResponse' {Int
httpStatus :: Int
$sel:httpStatus:TestMetricFilterResponse' :: TestMetricFilterResponse -> Int
httpStatus} -> Int
httpStatus) (\s :: TestMetricFilterResponse
s@TestMetricFilterResponse' {} Int
a -> TestMetricFilterResponse
s {$sel:httpStatus:TestMetricFilterResponse' :: Int
httpStatus = Int
a} :: TestMetricFilterResponse)

instance Prelude.NFData TestMetricFilterResponse where
  rnf :: TestMetricFilterResponse -> ()
rnf TestMetricFilterResponse' {Int
Maybe [MetricFilterMatchRecord]
httpStatus :: Int
matches :: Maybe [MetricFilterMatchRecord]
$sel:httpStatus:TestMetricFilterResponse' :: TestMetricFilterResponse -> Int
$sel:matches:TestMetricFilterResponse' :: TestMetricFilterResponse -> Maybe [MetricFilterMatchRecord]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [MetricFilterMatchRecord]
matches
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus