{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE UndecidableInstances #-}

module Aws.Lambda.Runtime.StandaloneLambda.Types
  ( StandaloneLambdaResponseBody (..),
    ToStandaloneLambdaResponseBody (..),
  )
where

import Aws.Lambda.Utilities (toJSONText)
import Data.Aeson (FromJSON, ToJSON)
import Data.Text (Text)
import qualified Data.Text as Text

-- | Wrapper type for lambda response body
newtype StandaloneLambdaResponseBody = StandaloneLambdaResponseBody {StandaloneLambdaResponseBody -> Text
unStandaloneLambdaResponseBody :: Text}
  deriving newtype ([StandaloneLambdaResponseBody] -> Encoding
[StandaloneLambdaResponseBody] -> Value
StandaloneLambdaResponseBody -> Encoding
StandaloneLambdaResponseBody -> Value
(StandaloneLambdaResponseBody -> Value)
-> (StandaloneLambdaResponseBody -> Encoding)
-> ([StandaloneLambdaResponseBody] -> Value)
-> ([StandaloneLambdaResponseBody] -> Encoding)
-> ToJSON StandaloneLambdaResponseBody
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> ToJSON a
toEncodingList :: [StandaloneLambdaResponseBody] -> Encoding
$ctoEncodingList :: [StandaloneLambdaResponseBody] -> Encoding
toJSONList :: [StandaloneLambdaResponseBody] -> Value
$ctoJSONList :: [StandaloneLambdaResponseBody] -> Value
toEncoding :: StandaloneLambdaResponseBody -> Encoding
$ctoEncoding :: StandaloneLambdaResponseBody -> Encoding
toJSON :: StandaloneLambdaResponseBody -> Value
$ctoJSON :: StandaloneLambdaResponseBody -> Value
ToJSON, Value -> Parser [StandaloneLambdaResponseBody]
Value -> Parser StandaloneLambdaResponseBody
(Value -> Parser StandaloneLambdaResponseBody)
-> (Value -> Parser [StandaloneLambdaResponseBody])
-> FromJSON StandaloneLambdaResponseBody
forall a.
(Value -> Parser a) -> (Value -> Parser [a]) -> FromJSON a
parseJSONList :: Value -> Parser [StandaloneLambdaResponseBody]
$cparseJSONList :: Value -> Parser [StandaloneLambdaResponseBody]
parseJSON :: Value -> Parser StandaloneLambdaResponseBody
$cparseJSON :: Value -> Parser StandaloneLambdaResponseBody
FromJSON)

class ToStandaloneLambdaResponseBody a where
  toStandaloneLambdaResponse :: a -> StandaloneLambdaResponseBody

-- We need to special case String and Text to avoid unneeded encoding
-- which results in extra quotes put around plain text responses
instance {-# OVERLAPPING #-} ToStandaloneLambdaResponseBody String where
  toStandaloneLambdaResponse :: String -> StandaloneLambdaResponseBody
toStandaloneLambdaResponse = Text -> StandaloneLambdaResponseBody
StandaloneLambdaResponseBody (Text -> StandaloneLambdaResponseBody)
-> (String -> Text) -> String -> StandaloneLambdaResponseBody
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
Text.pack

instance {-# OVERLAPPING #-} ToStandaloneLambdaResponseBody Text where
  toStandaloneLambdaResponse :: Text -> StandaloneLambdaResponseBody
toStandaloneLambdaResponse = Text -> StandaloneLambdaResponseBody
StandaloneLambdaResponseBody

instance ToJSON a => ToStandaloneLambdaResponseBody a where
  toStandaloneLambdaResponse :: a -> StandaloneLambdaResponseBody
toStandaloneLambdaResponse = Text -> StandaloneLambdaResponseBody
StandaloneLambdaResponseBody (Text -> StandaloneLambdaResponseBody)
-> (a -> Text) -> a -> StandaloneLambdaResponseBody
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Text
forall a. ToJSON a => a -> Text
toJSONText