{-# 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.Forecast.CreateMonitor
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Creates a predictor monitor resource for an existing auto predictor.
-- Predictor monitoring allows you to see how your predictor\'s performance
-- changes over time. For more information, see
-- <https://docs.aws.amazon.com/forecast/latest/dg/predictor-monitoring.html Predictor Monitoring>.
module Amazonka.Forecast.CreateMonitor
  ( -- * Creating a Request
    CreateMonitor (..),
    newCreateMonitor,

    -- * Request Lenses
    createMonitor_tags,
    createMonitor_monitorName,
    createMonitor_resourceArn,

    -- * Destructuring the Response
    CreateMonitorResponse (..),
    newCreateMonitorResponse,

    -- * Response Lenses
    createMonitorResponse_monitorArn,
    createMonitorResponse_httpStatus,
  )
where

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

-- | /See:/ 'newCreateMonitor' smart constructor.
data CreateMonitor = CreateMonitor'
  { -- | A list of
    -- <https://docs.aws.amazon.com/forecast/latest/dg/tagging-forecast-resources.html tags>
    -- to apply to the monitor resource.
    CreateMonitor -> Maybe [Tag]
tags :: Prelude.Maybe [Tag],
    -- | The name of the monitor resource.
    CreateMonitor -> Text
monitorName :: Prelude.Text,
    -- | The Amazon Resource Name (ARN) of the predictor to monitor.
    CreateMonitor -> Text
resourceArn :: Prelude.Text
  }
  deriving (CreateMonitor -> CreateMonitor -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateMonitor -> CreateMonitor -> Bool
$c/= :: CreateMonitor -> CreateMonitor -> Bool
== :: CreateMonitor -> CreateMonitor -> Bool
$c== :: CreateMonitor -> CreateMonitor -> Bool
Prelude.Eq, Int -> CreateMonitor -> ShowS
[CreateMonitor] -> ShowS
CreateMonitor -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateMonitor] -> ShowS
$cshowList :: [CreateMonitor] -> ShowS
show :: CreateMonitor -> String
$cshow :: CreateMonitor -> String
showsPrec :: Int -> CreateMonitor -> ShowS
$cshowsPrec :: Int -> CreateMonitor -> ShowS
Prelude.Show, forall x. Rep CreateMonitor x -> CreateMonitor
forall x. CreateMonitor -> Rep CreateMonitor x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateMonitor x -> CreateMonitor
$cfrom :: forall x. CreateMonitor -> Rep CreateMonitor x
Prelude.Generic)

-- |
-- Create a value of 'CreateMonitor' 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:
--
-- 'tags', 'createMonitor_tags' - A list of
-- <https://docs.aws.amazon.com/forecast/latest/dg/tagging-forecast-resources.html tags>
-- to apply to the monitor resource.
--
-- 'monitorName', 'createMonitor_monitorName' - The name of the monitor resource.
--
-- 'resourceArn', 'createMonitor_resourceArn' - The Amazon Resource Name (ARN) of the predictor to monitor.
newCreateMonitor ::
  -- | 'monitorName'
  Prelude.Text ->
  -- | 'resourceArn'
  Prelude.Text ->
  CreateMonitor
newCreateMonitor :: Text -> Text -> CreateMonitor
newCreateMonitor Text
pMonitorName_ Text
pResourceArn_ =
  CreateMonitor'
    { $sel:tags:CreateMonitor' :: Maybe [Tag]
tags = forall a. Maybe a
Prelude.Nothing,
      $sel:monitorName:CreateMonitor' :: Text
monitorName = Text
pMonitorName_,
      $sel:resourceArn:CreateMonitor' :: Text
resourceArn = Text
pResourceArn_
    }

-- | A list of
-- <https://docs.aws.amazon.com/forecast/latest/dg/tagging-forecast-resources.html tags>
-- to apply to the monitor resource.
createMonitor_tags :: Lens.Lens' CreateMonitor (Prelude.Maybe [Tag])
createMonitor_tags :: Lens' CreateMonitor (Maybe [Tag])
createMonitor_tags = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateMonitor' {Maybe [Tag]
tags :: Maybe [Tag]
$sel:tags:CreateMonitor' :: CreateMonitor -> Maybe [Tag]
tags} -> Maybe [Tag]
tags) (\s :: CreateMonitor
s@CreateMonitor' {} Maybe [Tag]
a -> CreateMonitor
s {$sel:tags:CreateMonitor' :: Maybe [Tag]
tags = Maybe [Tag]
a} :: CreateMonitor) 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 name of the monitor resource.
createMonitor_monitorName :: Lens.Lens' CreateMonitor Prelude.Text
createMonitor_monitorName :: Lens' CreateMonitor Text
createMonitor_monitorName = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateMonitor' {Text
monitorName :: Text
$sel:monitorName:CreateMonitor' :: CreateMonitor -> Text
monitorName} -> Text
monitorName) (\s :: CreateMonitor
s@CreateMonitor' {} Text
a -> CreateMonitor
s {$sel:monitorName:CreateMonitor' :: Text
monitorName = Text
a} :: CreateMonitor)

-- | The Amazon Resource Name (ARN) of the predictor to monitor.
createMonitor_resourceArn :: Lens.Lens' CreateMonitor Prelude.Text
createMonitor_resourceArn :: Lens' CreateMonitor Text
createMonitor_resourceArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateMonitor' {Text
resourceArn :: Text
$sel:resourceArn:CreateMonitor' :: CreateMonitor -> Text
resourceArn} -> Text
resourceArn) (\s :: CreateMonitor
s@CreateMonitor' {} Text
a -> CreateMonitor
s {$sel:resourceArn:CreateMonitor' :: Text
resourceArn = Text
a} :: CreateMonitor)

instance Core.AWSRequest CreateMonitor where
  type
    AWSResponse CreateMonitor =
      CreateMonitorResponse
  request :: (Service -> Service) -> CreateMonitor -> Request CreateMonitor
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 CreateMonitor
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse CreateMonitor)))
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 Text -> Int -> CreateMonitorResponse
CreateMonitorResponse'
            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
"MonitorArn")
            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 CreateMonitor where
  hashWithSalt :: Int -> CreateMonitor -> Int
hashWithSalt Int
_salt CreateMonitor' {Maybe [Tag]
Text
resourceArn :: Text
monitorName :: Text
tags :: Maybe [Tag]
$sel:resourceArn:CreateMonitor' :: CreateMonitor -> Text
$sel:monitorName:CreateMonitor' :: CreateMonitor -> Text
$sel:tags:CreateMonitor' :: CreateMonitor -> Maybe [Tag]
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe [Tag]
tags
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
monitorName
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
resourceArn

instance Prelude.NFData CreateMonitor where
  rnf :: CreateMonitor -> ()
rnf CreateMonitor' {Maybe [Tag]
Text
resourceArn :: Text
monitorName :: Text
tags :: Maybe [Tag]
$sel:resourceArn:CreateMonitor' :: CreateMonitor -> Text
$sel:monitorName:CreateMonitor' :: CreateMonitor -> Text
$sel:tags:CreateMonitor' :: CreateMonitor -> Maybe [Tag]
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe [Tag]
tags
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
monitorName
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
resourceArn

instance Data.ToHeaders CreateMonitor where
  toHeaders :: CreateMonitor -> 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
"AmazonForecast.CreateMonitor" ::
                          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 CreateMonitor where
  toJSON :: CreateMonitor -> Value
toJSON CreateMonitor' {Maybe [Tag]
Text
resourceArn :: Text
monitorName :: Text
tags :: Maybe [Tag]
$sel:resourceArn:CreateMonitor' :: CreateMonitor -> Text
$sel:monitorName:CreateMonitor' :: CreateMonitor -> Text
$sel:tags:CreateMonitor' :: CreateMonitor -> Maybe [Tag]
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"Tags" 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 [Tag]
tags,
            forall a. a -> Maybe a
Prelude.Just (Key
"MonitorName" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
monitorName),
            forall a. a -> Maybe a
Prelude.Just (Key
"ResourceArn" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
resourceArn)
          ]
      )

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

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

-- | /See:/ 'newCreateMonitorResponse' smart constructor.
data CreateMonitorResponse = CreateMonitorResponse'
  { -- | The Amazon Resource Name (ARN) of the monitor resource.
    CreateMonitorResponse -> Maybe Text
monitorArn :: Prelude.Maybe Prelude.Text,
    -- | The response's http status code.
    CreateMonitorResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (CreateMonitorResponse -> CreateMonitorResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CreateMonitorResponse -> CreateMonitorResponse -> Bool
$c/= :: CreateMonitorResponse -> CreateMonitorResponse -> Bool
== :: CreateMonitorResponse -> CreateMonitorResponse -> Bool
$c== :: CreateMonitorResponse -> CreateMonitorResponse -> Bool
Prelude.Eq, ReadPrec [CreateMonitorResponse]
ReadPrec CreateMonitorResponse
Int -> ReadS CreateMonitorResponse
ReadS [CreateMonitorResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [CreateMonitorResponse]
$creadListPrec :: ReadPrec [CreateMonitorResponse]
readPrec :: ReadPrec CreateMonitorResponse
$creadPrec :: ReadPrec CreateMonitorResponse
readList :: ReadS [CreateMonitorResponse]
$creadList :: ReadS [CreateMonitorResponse]
readsPrec :: Int -> ReadS CreateMonitorResponse
$creadsPrec :: Int -> ReadS CreateMonitorResponse
Prelude.Read, Int -> CreateMonitorResponse -> ShowS
[CreateMonitorResponse] -> ShowS
CreateMonitorResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CreateMonitorResponse] -> ShowS
$cshowList :: [CreateMonitorResponse] -> ShowS
show :: CreateMonitorResponse -> String
$cshow :: CreateMonitorResponse -> String
showsPrec :: Int -> CreateMonitorResponse -> ShowS
$cshowsPrec :: Int -> CreateMonitorResponse -> ShowS
Prelude.Show, forall x. Rep CreateMonitorResponse x -> CreateMonitorResponse
forall x. CreateMonitorResponse -> Rep CreateMonitorResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep CreateMonitorResponse x -> CreateMonitorResponse
$cfrom :: forall x. CreateMonitorResponse -> Rep CreateMonitorResponse x
Prelude.Generic)

-- |
-- Create a value of 'CreateMonitorResponse' 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:
--
-- 'monitorArn', 'createMonitorResponse_monitorArn' - The Amazon Resource Name (ARN) of the monitor resource.
--
-- 'httpStatus', 'createMonitorResponse_httpStatus' - The response's http status code.
newCreateMonitorResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  CreateMonitorResponse
newCreateMonitorResponse :: Int -> CreateMonitorResponse
newCreateMonitorResponse Int
pHttpStatus_ =
  CreateMonitorResponse'
    { $sel:monitorArn:CreateMonitorResponse' :: Maybe Text
monitorArn =
        forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:CreateMonitorResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | The Amazon Resource Name (ARN) of the monitor resource.
createMonitorResponse_monitorArn :: Lens.Lens' CreateMonitorResponse (Prelude.Maybe Prelude.Text)
createMonitorResponse_monitorArn :: Lens' CreateMonitorResponse (Maybe Text)
createMonitorResponse_monitorArn = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\CreateMonitorResponse' {Maybe Text
monitorArn :: Maybe Text
$sel:monitorArn:CreateMonitorResponse' :: CreateMonitorResponse -> Maybe Text
monitorArn} -> Maybe Text
monitorArn) (\s :: CreateMonitorResponse
s@CreateMonitorResponse' {} Maybe Text
a -> CreateMonitorResponse
s {$sel:monitorArn:CreateMonitorResponse' :: Maybe Text
monitorArn = Maybe Text
a} :: CreateMonitorResponse)

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

instance Prelude.NFData CreateMonitorResponse where
  rnf :: CreateMonitorResponse -> ()
rnf CreateMonitorResponse' {Int
Maybe Text
httpStatus :: Int
monitorArn :: Maybe Text
$sel:httpStatus:CreateMonitorResponse' :: CreateMonitorResponse -> Int
$sel:monitorArn:CreateMonitorResponse' :: CreateMonitorResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
monitorArn
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus