{-# 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.S3.Types.InputSerialization
-- 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.S3.Types.InputSerialization where

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 Amazonka.S3.Internal
import Amazonka.S3.Types.CSVInput
import Amazonka.S3.Types.CompressionType
import Amazonka.S3.Types.JSONInput
import Amazonka.S3.Types.ParquetInput

-- | Describes the serialization format of the object.
--
-- /See:/ 'newInputSerialization' smart constructor.
data InputSerialization = InputSerialization'
  { -- | Describes the serialization of a CSV-encoded object.
    InputSerialization -> Maybe CSVInput
csv :: Prelude.Maybe CSVInput,
    -- | Specifies object\'s compression format. Valid values: NONE, GZIP, BZIP2.
    -- Default Value: NONE.
    InputSerialization -> Maybe CompressionType
compressionType :: Prelude.Maybe CompressionType,
    -- | Specifies JSON as object\'s input serialization format.
    InputSerialization -> Maybe JSONInput
json :: Prelude.Maybe JSONInput,
    -- | Specifies Parquet as object\'s input serialization format.
    InputSerialization -> Maybe ParquetInput
parquet :: Prelude.Maybe ParquetInput
  }
  deriving (InputSerialization -> InputSerialization -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: InputSerialization -> InputSerialization -> Bool
$c/= :: InputSerialization -> InputSerialization -> Bool
== :: InputSerialization -> InputSerialization -> Bool
$c== :: InputSerialization -> InputSerialization -> Bool
Prelude.Eq, ReadPrec [InputSerialization]
ReadPrec InputSerialization
Int -> ReadS InputSerialization
ReadS [InputSerialization]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [InputSerialization]
$creadListPrec :: ReadPrec [InputSerialization]
readPrec :: ReadPrec InputSerialization
$creadPrec :: ReadPrec InputSerialization
readList :: ReadS [InputSerialization]
$creadList :: ReadS [InputSerialization]
readsPrec :: Int -> ReadS InputSerialization
$creadsPrec :: Int -> ReadS InputSerialization
Prelude.Read, Int -> InputSerialization -> ShowS
[InputSerialization] -> ShowS
InputSerialization -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InputSerialization] -> ShowS
$cshowList :: [InputSerialization] -> ShowS
show :: InputSerialization -> String
$cshow :: InputSerialization -> String
showsPrec :: Int -> InputSerialization -> ShowS
$cshowsPrec :: Int -> InputSerialization -> ShowS
Prelude.Show, forall x. Rep InputSerialization x -> InputSerialization
forall x. InputSerialization -> Rep InputSerialization x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep InputSerialization x -> InputSerialization
$cfrom :: forall x. InputSerialization -> Rep InputSerialization x
Prelude.Generic)

-- |
-- Create a value of 'InputSerialization' 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:
--
-- 'csv', 'inputSerialization_csv' - Describes the serialization of a CSV-encoded object.
--
-- 'compressionType', 'inputSerialization_compressionType' - Specifies object\'s compression format. Valid values: NONE, GZIP, BZIP2.
-- Default Value: NONE.
--
-- 'json', 'inputSerialization_json' - Specifies JSON as object\'s input serialization format.
--
-- 'parquet', 'inputSerialization_parquet' - Specifies Parquet as object\'s input serialization format.
newInputSerialization ::
  InputSerialization
newInputSerialization :: InputSerialization
newInputSerialization =
  InputSerialization'
    { $sel:csv:InputSerialization' :: Maybe CSVInput
csv = forall a. Maybe a
Prelude.Nothing,
      $sel:compressionType:InputSerialization' :: Maybe CompressionType
compressionType = forall a. Maybe a
Prelude.Nothing,
      $sel:json:InputSerialization' :: Maybe JSONInput
json = forall a. Maybe a
Prelude.Nothing,
      $sel:parquet:InputSerialization' :: Maybe ParquetInput
parquet = forall a. Maybe a
Prelude.Nothing
    }

-- | Describes the serialization of a CSV-encoded object.
inputSerialization_csv :: Lens.Lens' InputSerialization (Prelude.Maybe CSVInput)
inputSerialization_csv :: Lens' InputSerialization (Maybe CSVInput)
inputSerialization_csv = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InputSerialization' {Maybe CSVInput
csv :: Maybe CSVInput
$sel:csv:InputSerialization' :: InputSerialization -> Maybe CSVInput
csv} -> Maybe CSVInput
csv) (\s :: InputSerialization
s@InputSerialization' {} Maybe CSVInput
a -> InputSerialization
s {$sel:csv:InputSerialization' :: Maybe CSVInput
csv = Maybe CSVInput
a} :: InputSerialization)

-- | Specifies object\'s compression format. Valid values: NONE, GZIP, BZIP2.
-- Default Value: NONE.
inputSerialization_compressionType :: Lens.Lens' InputSerialization (Prelude.Maybe CompressionType)
inputSerialization_compressionType :: Lens' InputSerialization (Maybe CompressionType)
inputSerialization_compressionType = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InputSerialization' {Maybe CompressionType
compressionType :: Maybe CompressionType
$sel:compressionType:InputSerialization' :: InputSerialization -> Maybe CompressionType
compressionType} -> Maybe CompressionType
compressionType) (\s :: InputSerialization
s@InputSerialization' {} Maybe CompressionType
a -> InputSerialization
s {$sel:compressionType:InputSerialization' :: Maybe CompressionType
compressionType = Maybe CompressionType
a} :: InputSerialization)

-- | Specifies JSON as object\'s input serialization format.
inputSerialization_json :: Lens.Lens' InputSerialization (Prelude.Maybe JSONInput)
inputSerialization_json :: Lens' InputSerialization (Maybe JSONInput)
inputSerialization_json = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InputSerialization' {Maybe JSONInput
json :: Maybe JSONInput
$sel:json:InputSerialization' :: InputSerialization -> Maybe JSONInput
json} -> Maybe JSONInput
json) (\s :: InputSerialization
s@InputSerialization' {} Maybe JSONInput
a -> InputSerialization
s {$sel:json:InputSerialization' :: Maybe JSONInput
json = Maybe JSONInput
a} :: InputSerialization)

-- | Specifies Parquet as object\'s input serialization format.
inputSerialization_parquet :: Lens.Lens' InputSerialization (Prelude.Maybe ParquetInput)
inputSerialization_parquet :: Lens' InputSerialization (Maybe ParquetInput)
inputSerialization_parquet = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\InputSerialization' {Maybe ParquetInput
parquet :: Maybe ParquetInput
$sel:parquet:InputSerialization' :: InputSerialization -> Maybe ParquetInput
parquet} -> Maybe ParquetInput
parquet) (\s :: InputSerialization
s@InputSerialization' {} Maybe ParquetInput
a -> InputSerialization
s {$sel:parquet:InputSerialization' :: Maybe ParquetInput
parquet = Maybe ParquetInput
a} :: InputSerialization)

instance Prelude.Hashable InputSerialization where
  hashWithSalt :: Int -> InputSerialization -> Int
hashWithSalt Int
_salt InputSerialization' {Maybe CompressionType
Maybe CSVInput
Maybe JSONInput
Maybe ParquetInput
parquet :: Maybe ParquetInput
json :: Maybe JSONInput
compressionType :: Maybe CompressionType
csv :: Maybe CSVInput
$sel:parquet:InputSerialization' :: InputSerialization -> Maybe ParquetInput
$sel:json:InputSerialization' :: InputSerialization -> Maybe JSONInput
$sel:compressionType:InputSerialization' :: InputSerialization -> Maybe CompressionType
$sel:csv:InputSerialization' :: InputSerialization -> Maybe CSVInput
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CSVInput
csv
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe CompressionType
compressionType
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe JSONInput
json
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe ParquetInput
parquet

instance Prelude.NFData InputSerialization where
  rnf :: InputSerialization -> ()
rnf InputSerialization' {Maybe CompressionType
Maybe CSVInput
Maybe JSONInput
Maybe ParquetInput
parquet :: Maybe ParquetInput
json :: Maybe JSONInput
compressionType :: Maybe CompressionType
csv :: Maybe CSVInput
$sel:parquet:InputSerialization' :: InputSerialization -> Maybe ParquetInput
$sel:json:InputSerialization' :: InputSerialization -> Maybe JSONInput
$sel:compressionType:InputSerialization' :: InputSerialization -> Maybe CompressionType
$sel:csv:InputSerialization' :: InputSerialization -> Maybe CSVInput
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe CSVInput
csv
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe CompressionType
compressionType
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe JSONInput
json
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe ParquetInput
parquet

instance Data.ToXML InputSerialization where
  toXML :: InputSerialization -> XML
toXML InputSerialization' {Maybe CompressionType
Maybe CSVInput
Maybe JSONInput
Maybe ParquetInput
parquet :: Maybe ParquetInput
json :: Maybe JSONInput
compressionType :: Maybe CompressionType
csv :: Maybe CSVInput
$sel:parquet:InputSerialization' :: InputSerialization -> Maybe ParquetInput
$sel:json:InputSerialization' :: InputSerialization -> Maybe JSONInput
$sel:compressionType:InputSerialization' :: InputSerialization -> Maybe CompressionType
$sel:csv:InputSerialization' :: InputSerialization -> Maybe CSVInput
..} =
    forall a. Monoid a => [a] -> a
Prelude.mconcat
      [ Name
"CSV" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe CSVInput
csv,
        Name
"CompressionType" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe CompressionType
compressionType,
        Name
"JSON" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe JSONInput
json,
        Name
"Parquet" forall a. ToXML a => Name -> a -> XML
Data.@= Maybe ParquetInput
parquet
      ]