packages feed

rds-data-0.0.0.1: src/Data/RdsData/Types/Array.hs

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

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

module Data.RdsData.Types.Array
  ( Array(..)
  , fromArrayValue
  , toArrayValue
  ) where

import           Control.Applicative
import           Data.Generics.Product.Any
import           Data.Text
import           GHC.Generics
import           Lens.Micro

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

data Array =
    ArrayOfArrays   [Array]
  | ArrayOfBools    [Bool]
  | ArrayOfDoubles  [Double]
  | ArrayOfIntegers [Integer]
  | ArrayOfTexts    [Text]
  deriving (Eq, Generic, Show)

instance J.ToJSON Array where

fromArrayValue :: AWS.ArrayValue -> Maybe Array
fromArrayValue v =
  asum
    [ v ^. the @"booleanValues" >>= pure . ArrayOfBools
    , v ^. the @"doubleValues"  >>= pure . ArrayOfDoubles
    , v ^. the @"longValues"    >>= pure . ArrayOfIntegers
    , v ^. the @"stringValues"  >>= pure . ArrayOfTexts
    , v ^. the @"arrayValues"   >>= fmap ArrayOfArrays . traverse fromArrayValue
    ]

toArrayValue :: Array -> AWS.ArrayValue
toArrayValue = \case
  ArrayOfArrays   vs -> AWS.newArrayValue & the @"arrayValues"    .~ Just (toArrayValue <$> vs)
  ArrayOfBools    vs -> AWS.newArrayValue & the @"booleanValues"  .~ Just vs
  ArrayOfDoubles  vs -> AWS.newArrayValue & the @"doubleValues"   .~ Just vs
  ArrayOfIntegers vs -> AWS.newArrayValue & the @"longValues"     .~ Just vs
  ArrayOfTexts    vs -> AWS.newArrayValue & the @"stringValues"   .~ Just vs