{-# 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.MediaStoreData.DescribeObject
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
--
-- Gets the headers for an object at the specified path.
module Amazonka.MediaStoreData.DescribeObject
  ( -- * Creating a Request
    DescribeObject (..),
    newDescribeObject,

    -- * Request Lenses
    describeObject_path,

    -- * Destructuring the Response
    DescribeObjectResponse (..),
    newDescribeObjectResponse,

    -- * Response Lenses
    describeObjectResponse_cacheControl,
    describeObjectResponse_contentLength,
    describeObjectResponse_contentType,
    describeObjectResponse_eTag,
    describeObjectResponse_lastModified,
    describeObjectResponse_httpStatus,
  )
where

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

-- | /See:/ 'newDescribeObject' smart constructor.
data DescribeObject = DescribeObject'
  { -- | The path (including the file name) where the object is stored in the
    -- container. Format: \<folder name>\/\<folder name>\/\<file name>
    DescribeObject -> Text
path :: Prelude.Text
  }
  deriving (DescribeObject -> DescribeObject -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeObject -> DescribeObject -> Bool
$c/= :: DescribeObject -> DescribeObject -> Bool
== :: DescribeObject -> DescribeObject -> Bool
$c== :: DescribeObject -> DescribeObject -> Bool
Prelude.Eq, ReadPrec [DescribeObject]
ReadPrec DescribeObject
Int -> ReadS DescribeObject
ReadS [DescribeObject]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeObject]
$creadListPrec :: ReadPrec [DescribeObject]
readPrec :: ReadPrec DescribeObject
$creadPrec :: ReadPrec DescribeObject
readList :: ReadS [DescribeObject]
$creadList :: ReadS [DescribeObject]
readsPrec :: Int -> ReadS DescribeObject
$creadsPrec :: Int -> ReadS DescribeObject
Prelude.Read, Int -> DescribeObject -> ShowS
[DescribeObject] -> ShowS
DescribeObject -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeObject] -> ShowS
$cshowList :: [DescribeObject] -> ShowS
show :: DescribeObject -> String
$cshow :: DescribeObject -> String
showsPrec :: Int -> DescribeObject -> ShowS
$cshowsPrec :: Int -> DescribeObject -> ShowS
Prelude.Show, forall x. Rep DescribeObject x -> DescribeObject
forall x. DescribeObject -> Rep DescribeObject x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DescribeObject x -> DescribeObject
$cfrom :: forall x. DescribeObject -> Rep DescribeObject x
Prelude.Generic)

-- |
-- Create a value of 'DescribeObject' 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:
--
-- 'path', 'describeObject_path' - The path (including the file name) where the object is stored in the
-- container. Format: \<folder name>\/\<folder name>\/\<file name>
newDescribeObject ::
  -- | 'path'
  Prelude.Text ->
  DescribeObject
newDescribeObject :: Text -> DescribeObject
newDescribeObject Text
pPath_ =
  DescribeObject' {$sel:path:DescribeObject' :: Text
path = Text
pPath_}

-- | The path (including the file name) where the object is stored in the
-- container. Format: \<folder name>\/\<folder name>\/\<file name>
describeObject_path :: Lens.Lens' DescribeObject Prelude.Text
describeObject_path :: Lens' DescribeObject Text
describeObject_path = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeObject' {Text
path :: Text
$sel:path:DescribeObject' :: DescribeObject -> Text
path} -> Text
path) (\s :: DescribeObject
s@DescribeObject' {} Text
a -> DescribeObject
s {$sel:path:DescribeObject' :: Text
path = Text
a} :: DescribeObject)

instance Core.AWSRequest DescribeObject where
  type
    AWSResponse DescribeObject =
      DescribeObjectResponse
  request :: (Service -> Service) -> DescribeObject -> Request DescribeObject
request Service -> Service
overrides =
    forall a. ToRequest a => Service -> a -> Request a
Request.head' (Service -> Service
overrides Service
defaultService)
  response :: forall (m :: * -> *).
MonadResource m =>
(ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy DescribeObject
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse DescribeObject)))
response =
    forall (m :: * -> *) a.
MonadResource m =>
(Int -> ResponseHeaders -> () -> Either String (AWSResponse a))
-> (ByteStringLazy -> IO ByteStringLazy)
-> Service
-> Proxy a
-> ClientResponse ClientBody
-> m (Either Error (ClientResponse (AWSResponse a)))
Response.receiveEmpty
      ( \Int
s ResponseHeaders
h ()
x ->
          Maybe Text
-> Maybe Natural
-> Maybe Text
-> Maybe Text
-> Maybe POSIX
-> Int
-> DescribeObjectResponse
DescribeObjectResponse'
            forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"Cache-Control")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"Content-Length")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"Content-Type")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"ETag")
            forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
Prelude.<*> (ResponseHeaders
h forall a.
FromText a =>
ResponseHeaders -> HeaderName -> Either String (Maybe a)
Data..#? HeaderName
"Last-Modified")
            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 DescribeObject where
  hashWithSalt :: Int -> DescribeObject -> Int
hashWithSalt Int
_salt DescribeObject' {Text
path :: Text
$sel:path:DescribeObject' :: DescribeObject -> Text
..} =
    Int
_salt forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
path

instance Prelude.NFData DescribeObject where
  rnf :: DescribeObject -> ()
rnf DescribeObject' {Text
path :: Text
$sel:path:DescribeObject' :: DescribeObject -> Text
..} = forall a. NFData a => a -> ()
Prelude.rnf Text
path

instance Data.ToHeaders DescribeObject where
  toHeaders :: DescribeObject -> ResponseHeaders
toHeaders = forall a b. a -> b -> a
Prelude.const forall a. Monoid a => a
Prelude.mempty

instance Data.ToPath DescribeObject where
  toPath :: DescribeObject -> ByteString
toPath DescribeObject' {Text
path :: Text
$sel:path:DescribeObject' :: DescribeObject -> Text
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat [ByteString
"/", forall a. ToByteString a => a -> ByteString
Data.toBS Text
path]

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

-- | /See:/ 'newDescribeObjectResponse' smart constructor.
data DescribeObjectResponse = DescribeObjectResponse'
  { -- | An optional @CacheControl@ header that allows the caller to control the
    -- object\'s cache behavior. Headers can be passed in as specified in the
    -- HTTP at
    -- <https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9>.
    --
    -- Headers with a custom user-defined value are also accepted.
    DescribeObjectResponse -> Maybe Text
cacheControl :: Prelude.Maybe Prelude.Text,
    -- | The length of the object in bytes.
    DescribeObjectResponse -> Maybe Natural
contentLength :: Prelude.Maybe Prelude.Natural,
    -- | The content type of the object.
    DescribeObjectResponse -> Maybe Text
contentType :: Prelude.Maybe Prelude.Text,
    -- | The ETag that represents a unique instance of the object.
    DescribeObjectResponse -> Maybe Text
eTag :: Prelude.Maybe Prelude.Text,
    -- | The date and time that the object was last modified.
    DescribeObjectResponse -> Maybe POSIX
lastModified :: Prelude.Maybe Data.POSIX,
    -- | The response's http status code.
    DescribeObjectResponse -> Int
httpStatus :: Prelude.Int
  }
  deriving (DescribeObjectResponse -> DescribeObjectResponse -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DescribeObjectResponse -> DescribeObjectResponse -> Bool
$c/= :: DescribeObjectResponse -> DescribeObjectResponse -> Bool
== :: DescribeObjectResponse -> DescribeObjectResponse -> Bool
$c== :: DescribeObjectResponse -> DescribeObjectResponse -> Bool
Prelude.Eq, ReadPrec [DescribeObjectResponse]
ReadPrec DescribeObjectResponse
Int -> ReadS DescribeObjectResponse
ReadS [DescribeObjectResponse]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [DescribeObjectResponse]
$creadListPrec :: ReadPrec [DescribeObjectResponse]
readPrec :: ReadPrec DescribeObjectResponse
$creadPrec :: ReadPrec DescribeObjectResponse
readList :: ReadS [DescribeObjectResponse]
$creadList :: ReadS [DescribeObjectResponse]
readsPrec :: Int -> ReadS DescribeObjectResponse
$creadsPrec :: Int -> ReadS DescribeObjectResponse
Prelude.Read, Int -> DescribeObjectResponse -> ShowS
[DescribeObjectResponse] -> ShowS
DescribeObjectResponse -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DescribeObjectResponse] -> ShowS
$cshowList :: [DescribeObjectResponse] -> ShowS
show :: DescribeObjectResponse -> String
$cshow :: DescribeObjectResponse -> String
showsPrec :: Int -> DescribeObjectResponse -> ShowS
$cshowsPrec :: Int -> DescribeObjectResponse -> ShowS
Prelude.Show, forall x. Rep DescribeObjectResponse x -> DescribeObjectResponse
forall x. DescribeObjectResponse -> Rep DescribeObjectResponse x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep DescribeObjectResponse x -> DescribeObjectResponse
$cfrom :: forall x. DescribeObjectResponse -> Rep DescribeObjectResponse x
Prelude.Generic)

-- |
-- Create a value of 'DescribeObjectResponse' 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:
--
-- 'cacheControl', 'describeObjectResponse_cacheControl' - An optional @CacheControl@ header that allows the caller to control the
-- object\'s cache behavior. Headers can be passed in as specified in the
-- HTTP at
-- <https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9>.
--
-- Headers with a custom user-defined value are also accepted.
--
-- 'contentLength', 'describeObjectResponse_contentLength' - The length of the object in bytes.
--
-- 'contentType', 'describeObjectResponse_contentType' - The content type of the object.
--
-- 'eTag', 'describeObjectResponse_eTag' - The ETag that represents a unique instance of the object.
--
-- 'lastModified', 'describeObjectResponse_lastModified' - The date and time that the object was last modified.
--
-- 'httpStatus', 'describeObjectResponse_httpStatus' - The response's http status code.
newDescribeObjectResponse ::
  -- | 'httpStatus'
  Prelude.Int ->
  DescribeObjectResponse
newDescribeObjectResponse :: Int -> DescribeObjectResponse
newDescribeObjectResponse Int
pHttpStatus_ =
  DescribeObjectResponse'
    { $sel:cacheControl:DescribeObjectResponse' :: Maybe Text
cacheControl =
        forall a. Maybe a
Prelude.Nothing,
      $sel:contentLength:DescribeObjectResponse' :: Maybe Natural
contentLength = forall a. Maybe a
Prelude.Nothing,
      $sel:contentType:DescribeObjectResponse' :: Maybe Text
contentType = forall a. Maybe a
Prelude.Nothing,
      $sel:eTag:DescribeObjectResponse' :: Maybe Text
eTag = forall a. Maybe a
Prelude.Nothing,
      $sel:lastModified:DescribeObjectResponse' :: Maybe POSIX
lastModified = forall a. Maybe a
Prelude.Nothing,
      $sel:httpStatus:DescribeObjectResponse' :: Int
httpStatus = Int
pHttpStatus_
    }

-- | An optional @CacheControl@ header that allows the caller to control the
-- object\'s cache behavior. Headers can be passed in as specified in the
-- HTTP at
-- <https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9>.
--
-- Headers with a custom user-defined value are also accepted.
describeObjectResponse_cacheControl :: Lens.Lens' DescribeObjectResponse (Prelude.Maybe Prelude.Text)
describeObjectResponse_cacheControl :: Lens' DescribeObjectResponse (Maybe Text)
describeObjectResponse_cacheControl = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeObjectResponse' {Maybe Text
cacheControl :: Maybe Text
$sel:cacheControl:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Text
cacheControl} -> Maybe Text
cacheControl) (\s :: DescribeObjectResponse
s@DescribeObjectResponse' {} Maybe Text
a -> DescribeObjectResponse
s {$sel:cacheControl:DescribeObjectResponse' :: Maybe Text
cacheControl = Maybe Text
a} :: DescribeObjectResponse)

-- | The length of the object in bytes.
describeObjectResponse_contentLength :: Lens.Lens' DescribeObjectResponse (Prelude.Maybe Prelude.Natural)
describeObjectResponse_contentLength :: Lens' DescribeObjectResponse (Maybe Natural)
describeObjectResponse_contentLength = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeObjectResponse' {Maybe Natural
contentLength :: Maybe Natural
$sel:contentLength:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Natural
contentLength} -> Maybe Natural
contentLength) (\s :: DescribeObjectResponse
s@DescribeObjectResponse' {} Maybe Natural
a -> DescribeObjectResponse
s {$sel:contentLength:DescribeObjectResponse' :: Maybe Natural
contentLength = Maybe Natural
a} :: DescribeObjectResponse)

-- | The content type of the object.
describeObjectResponse_contentType :: Lens.Lens' DescribeObjectResponse (Prelude.Maybe Prelude.Text)
describeObjectResponse_contentType :: Lens' DescribeObjectResponse (Maybe Text)
describeObjectResponse_contentType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeObjectResponse' {Maybe Text
contentType :: Maybe Text
$sel:contentType:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Text
contentType} -> Maybe Text
contentType) (\s :: DescribeObjectResponse
s@DescribeObjectResponse' {} Maybe Text
a -> DescribeObjectResponse
s {$sel:contentType:DescribeObjectResponse' :: Maybe Text
contentType = Maybe Text
a} :: DescribeObjectResponse)

-- | The ETag that represents a unique instance of the object.
describeObjectResponse_eTag :: Lens.Lens' DescribeObjectResponse (Prelude.Maybe Prelude.Text)
describeObjectResponse_eTag :: Lens' DescribeObjectResponse (Maybe Text)
describeObjectResponse_eTag = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeObjectResponse' {Maybe Text
eTag :: Maybe Text
$sel:eTag:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Text
eTag} -> Maybe Text
eTag) (\s :: DescribeObjectResponse
s@DescribeObjectResponse' {} Maybe Text
a -> DescribeObjectResponse
s {$sel:eTag:DescribeObjectResponse' :: Maybe Text
eTag = Maybe Text
a} :: DescribeObjectResponse)

-- | The date and time that the object was last modified.
describeObjectResponse_lastModified :: Lens.Lens' DescribeObjectResponse (Prelude.Maybe Prelude.UTCTime)
describeObjectResponse_lastModified :: Lens' DescribeObjectResponse (Maybe UTCTime)
describeObjectResponse_lastModified = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\DescribeObjectResponse' {Maybe POSIX
lastModified :: Maybe POSIX
$sel:lastModified:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe POSIX
lastModified} -> Maybe POSIX
lastModified) (\s :: DescribeObjectResponse
s@DescribeObjectResponse' {} Maybe POSIX
a -> DescribeObjectResponse
s {$sel:lastModified:DescribeObjectResponse' :: Maybe POSIX
lastModified = Maybe POSIX
a} :: DescribeObjectResponse) 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 (a :: Format). Iso' (Time a) UTCTime
Data._Time

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

instance Prelude.NFData DescribeObjectResponse where
  rnf :: DescribeObjectResponse -> ()
rnf DescribeObjectResponse' {Int
Maybe Natural
Maybe Text
Maybe POSIX
httpStatus :: Int
lastModified :: Maybe POSIX
eTag :: Maybe Text
contentType :: Maybe Text
contentLength :: Maybe Natural
cacheControl :: Maybe Text
$sel:httpStatus:DescribeObjectResponse' :: DescribeObjectResponse -> Int
$sel:lastModified:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe POSIX
$sel:eTag:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Text
$sel:contentType:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Text
$sel:contentLength:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Natural
$sel:cacheControl:DescribeObjectResponse' :: DescribeObjectResponse -> Maybe Text
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
cacheControl
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Natural
contentLength
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
contentType
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Text
eTag
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe POSIX
lastModified
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Int
httpStatus