{-
   AWS Lambda Runtime API

   AWS Lambda Runtime API is an HTTP API for implementing custom runtimes

   OpenAPI Version: 3.0.0
   AWS Lambda Runtime API API version: 1.0.3
   Generated by OpenAPI Generator (https://openapi-generator.tech)
-}

{-|
Module : AWSLambdaRuntime.Model
-}

{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-unused-matches -fno-warn-unused-binds -fno-warn-unused-imports #-}

module AWSLambdaRuntime.Model where

import AWSLambdaRuntime.Core
import AWSLambdaRuntime.MimeTypes

import Data.Aeson ((.:),(.:!),(.:?),(.=))

import qualified Control.Arrow as P (left)
import qualified Data.Aeson as A
import qualified Data.ByteString as B
import qualified Data.ByteString.Base64 as B64
import qualified Data.ByteString.Char8 as BC
import qualified Data.ByteString.Lazy as BL
import qualified Data.Data as P (Typeable, TypeRep, typeOf, typeRep)
import qualified Data.Foldable as P
import qualified Data.HashMap.Lazy as HM
import qualified Data.Map as Map
import qualified Data.Maybe as P
import qualified Data.Set as Set
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.Time as TI
import qualified Lens.Micro as L
import qualified Web.FormUrlEncoded as WH
import qualified Web.HttpApiData as WH

import Control.Applicative ((<|>))
import Control.Applicative (Alternative)
import Data.Function ((&))
import Data.Monoid ((<>))
import Data.Text (Text)
import Prelude (($),(/=),(.),(<$>),(<*>),(>>=),(=<<),Maybe(..),Bool(..),Char,Double,FilePath,Float,Int,Integer,String,fmap,undefined,mempty,maybe,pure,Monad,Applicative,Functor)

import qualified Prelude as P



-- * Parameter newtypes


-- ** AwsRequestId
newtype AwsRequestId = AwsRequestId { unAwsRequestId :: Text } deriving (P.Eq, P.Show)

-- ** Body
newtype Body = Body { unBody :: A.Value } deriving (P.Eq, P.Show, A.ToJSON)

-- ** LambdaRuntimeFunctionErrorType
newtype LambdaRuntimeFunctionErrorType = LambdaRuntimeFunctionErrorType { unLambdaRuntimeFunctionErrorType :: Text } deriving (P.Eq, P.Show)

-- * Models


-- ** ErrorRequest
-- | ErrorRequest
data ErrorRequest = ErrorRequest
  { errorRequestErrorMessage :: !(Maybe Text) -- ^ "errorMessage"
  , errorRequestErrorType :: !(Maybe Text) -- ^ "errorType"
  , errorRequestStackTrace :: !(Maybe [Text]) -- ^ "stackTrace"
  } deriving (P.Show, P.Eq, P.Typeable)

-- | FromJSON ErrorRequest
instance A.FromJSON ErrorRequest where
  parseJSON = A.withObject "ErrorRequest" $ \o ->
    ErrorRequest
      <$> (o .:? "errorMessage")
      <*> (o .:? "errorType")
      <*> (o .:? "stackTrace")

-- | ToJSON ErrorRequest
instance A.ToJSON ErrorRequest where
  toJSON ErrorRequest {..} =
   _omitNulls
      [ "errorMessage" .= errorRequestErrorMessage
      , "errorType" .= errorRequestErrorType
      , "stackTrace" .= errorRequestStackTrace
      ]


-- | Construct a value of type 'ErrorRequest' (by applying it's required fields, if any)
mkErrorRequest
  :: ErrorRequest
mkErrorRequest =
  ErrorRequest
  { errorRequestErrorMessage = Nothing
  , errorRequestErrorType = Nothing
  , errorRequestStackTrace = Nothing
  }

-- ** ErrorResponse
-- | ErrorResponse
data ErrorResponse = ErrorResponse
  { errorResponseErrorMessage :: !(Maybe Text) -- ^ "errorMessage"
  , errorResponseErrorType :: !(Maybe Text) -- ^ "errorType"
  } deriving (P.Show, P.Eq, P.Typeable)

-- | FromJSON ErrorResponse
instance A.FromJSON ErrorResponse where
  parseJSON = A.withObject "ErrorResponse" $ \o ->
    ErrorResponse
      <$> (o .:? "errorMessage")
      <*> (o .:? "errorType")

-- | ToJSON ErrorResponse
instance A.ToJSON ErrorResponse where
  toJSON ErrorResponse {..} =
   _omitNulls
      [ "errorMessage" .= errorResponseErrorMessage
      , "errorType" .= errorResponseErrorType
      ]


-- | Construct a value of type 'ErrorResponse' (by applying it's required fields, if any)
mkErrorResponse
  :: ErrorResponse
mkErrorResponse =
  ErrorResponse
  { errorResponseErrorMessage = Nothing
  , errorResponseErrorType = Nothing
  }

-- ** StatusResponse
-- | StatusResponse
data StatusResponse = StatusResponse
  { statusResponseStatus :: !(Maybe Text) -- ^ "status"
  } deriving (P.Show, P.Eq, P.Typeable)

-- | FromJSON StatusResponse
instance A.FromJSON StatusResponse where
  parseJSON = A.withObject "StatusResponse" $ \o ->
    StatusResponse
      <$> (o .:? "status")

-- | ToJSON StatusResponse
instance A.ToJSON StatusResponse where
  toJSON StatusResponse {..} =
   _omitNulls
      [ "status" .= statusResponseStatus
      ]


-- | Construct a value of type 'StatusResponse' (by applying it's required fields, if any)
mkStatusResponse
  :: StatusResponse
mkStatusResponse =
  StatusResponse
  { statusResponseStatus = Nothing
  }