{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeApplications #-}

{- HLINT ignore "Use <&>" -}

module Data.RdsData.Types.Value
  ( Value(..)
  , fromField
  , toField
  ) where

import Amazonka.Data.Base64
import Control.Applicative
import Control.Lens
import Data.Generics.Product.Any
import Data.RdsData.Internal.Maybe
import Data.RdsData.Types.Array
import Data.Text
import GHC.Generics

import qualified Amazonka.RDSData as AWS
import qualified Data.Aeson       as J

data Value =
    ValueOfArray    Array
  | ValueOfBase64   Base64
  | ValueOfBool     Bool
  | ValueOfDouble   Double
  | ValueOfInteger  Integer
  | ValueOfText     Text
  | ValueOfNull
  deriving (Value -> Value -> Bool
(Value -> Value -> Bool) -> (Value -> Value -> Bool) -> Eq Value
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Value -> Value -> Bool
== :: Value -> Value -> Bool
$c/= :: Value -> Value -> Bool
/= :: Value -> Value -> Bool
Eq, (forall x. Value -> Rep Value x)
-> (forall x. Rep Value x -> Value) -> Generic Value
forall x. Rep Value x -> Value
forall x. Value -> Rep Value x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Value -> Rep Value x
from :: forall x. Value -> Rep Value x
$cto :: forall x. Rep Value x -> Value
to :: forall x. Rep Value x -> Value
Generic, Int -> Value -> ShowS
[Value] -> ShowS
Value -> String
(Int -> Value -> ShowS)
-> (Value -> String) -> ([Value] -> ShowS) -> Show Value
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Value -> ShowS
showsPrec :: Int -> Value -> ShowS
$cshow :: Value -> String
show :: Value -> String
$cshowList :: [Value] -> ShowS
showList :: [Value] -> ShowS
Show)

instance J.ToJSON Value where

fromField :: AWS.Field -> Maybe Value
fromField :: Field -> Maybe Value
fromField Field
field =
  [Maybe Value] -> Maybe Value
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Alternative f) =>
t (f a) -> f a
asum
    [ Field
field Field
-> Getting (Maybe ArrayValue) Field (Maybe ArrayValue)
-> Maybe ArrayValue
forall s a. s -> Getting a s a -> a
^. forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"arrayValue"    Maybe ArrayValue -> (ArrayValue -> Maybe Array) -> Maybe Array
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ArrayValue -> Maybe Array
fromArrayValue Maybe Array -> (Array -> Maybe Value) -> Maybe Value
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Maybe Value
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Maybe Value) -> (Array -> Value) -> Array -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array -> Value
ValueOfArray
    , Field
field Field
-> Getting (Maybe Base64) Field (Maybe Base64) -> Maybe Base64
forall s a. s -> Getting a s a -> a
^. forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"blobValue"     Maybe Base64 -> (Base64 -> Maybe Value) -> Maybe Value
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Maybe Value
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Maybe Value)
-> (Base64 -> Value) -> Base64 -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Base64 -> Value
ValueOfBase64
    , Field
field Field -> Getting (Maybe Bool) Field (Maybe Bool) -> Maybe Bool
forall s a. s -> Getting a s a -> a
^. forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"booleanValue"  Maybe Bool -> (Bool -> Maybe Value) -> Maybe Value
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Maybe Value
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Maybe Value) -> (Bool -> Value) -> Bool -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> Value
ValueOfBool
    , Field
field Field
-> Getting (Maybe Double) Field (Maybe Double) -> Maybe Double
forall s a. s -> Getting a s a -> a
^. forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"doubleValue"   Maybe Double -> (Double -> Maybe Value) -> Maybe Value
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Maybe Value
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Maybe Value)
-> (Double -> Value) -> Double -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> Value
ValueOfDouble
    , Field
field Field
-> Getting (Maybe Integer) Field (Maybe Integer) -> Maybe Integer
forall s a. s -> Getting a s a -> a
^. forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"longValue"     Maybe Integer -> (Integer -> Maybe Value) -> Maybe Value
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Maybe Value
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Maybe Value)
-> (Integer -> Value) -> Integer -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Value
ValueOfInteger
    , Field
field Field -> Getting (Maybe Text) Field (Maybe Text) -> Maybe Text
forall s a. s -> Getting a s a -> a
^. forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"stringValue"   Maybe Text -> (Text -> Maybe Value) -> Maybe Value
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Maybe Value
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Value -> Maybe Value) -> (Text -> Value) -> Text -> Maybe Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Value
ValueOfText
    , Field
field Field -> Getting (Maybe Bool) Field (Maybe Bool) -> Maybe Bool
forall s a. s -> Getting a s a -> a
^. forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"isNull"        Maybe Bool -> (Bool -> Maybe Value) -> Maybe Value
forall a b. Maybe a -> (a -> Maybe b) -> Maybe b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Value -> Bool -> Maybe Value
forall a. a -> Bool -> Maybe a
toMaybe Value
ValueOfNull
    ]

toField :: Value -> AWS.Field
toField :: Value -> Field
toField = \case
  ValueOfArray    Array
v -> Field
AWS.newField Field -> (Field -> Field) -> Field
forall a b. a -> (a -> b) -> b
& forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"arrayValue" ((Maybe ArrayValue -> Identity (Maybe ArrayValue))
 -> Field -> Identity Field)
-> Maybe ArrayValue -> Field -> Field
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ArrayValue -> Maybe ArrayValue
forall a. a -> Maybe a
Just (Array -> ArrayValue
toArrayValue Array
v)
  ValueOfBase64   Base64
v -> Field
AWS.newField Field -> (Field -> Field) -> Field
forall a b. a -> (a -> b) -> b
& forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"blobValue" ((Maybe Base64 -> Identity (Maybe Base64))
 -> Field -> Identity Field)
-> Maybe Base64 -> Field -> Field
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Base64 -> Maybe Base64
forall a. a -> Maybe a
Just Base64
v
  ValueOfBool     Bool
v -> Field
AWS.newField Field -> (Field -> Field) -> Field
forall a b. a -> (a -> b) -> b
& forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"booleanValue" ((Maybe Bool -> Identity (Maybe Bool)) -> Field -> Identity Field)
-> Maybe Bool -> Field -> Field
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
v
  ValueOfDouble   Double
v -> Field
AWS.newField Field -> (Field -> Field) -> Field
forall a b. a -> (a -> b) -> b
& forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"doubleValue" ((Maybe Double -> Identity (Maybe Double))
 -> Field -> Identity Field)
-> Maybe Double -> Field -> Field
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Double -> Maybe Double
forall a. a -> Maybe a
Just Double
v
  ValueOfInteger  Integer
v -> Field
AWS.newField Field -> (Field -> Field) -> Field
forall a b. a -> (a -> b) -> b
& forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"longValue" ((Maybe Integer -> Identity (Maybe Integer))
 -> Field -> Identity Field)
-> Maybe Integer -> Field -> Field
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Integer -> Maybe Integer
forall a. a -> Maybe a
Just Integer
v
  ValueOfText     Text
v -> Field
AWS.newField Field -> (Field -> Field) -> Field
forall a b. a -> (a -> b) -> b
& forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"stringValue" ((Maybe Text -> Identity (Maybe Text)) -> Field -> Identity Field)
-> Maybe Text -> Field -> Field
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Text -> Maybe Text
forall a. a -> Maybe a
Just Text
v
  Value
ValueOfNull       -> Field
AWS.newField Field -> (Field -> Field) -> Field
forall a b. a -> (a -> b) -> b
& forall {k} (sel :: k) s t a b. HasAny sel s t a b => Lens s t a b
forall (sel :: Symbol) s t a b. HasAny sel s t a b => Lens s t a b
the @"isNull" ((Maybe Bool -> Identity (Maybe Bool)) -> Field -> Identity Field)
-> Maybe Bool -> Field -> Field
forall s t a b. ASetter s t a b -> b -> s -> t
.~ Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True