module Aws.Lambda.Runtime.Context
( Context(..)
, initialize
, setEventData
) where
import Control.Exception.Safe.Checked
import Data.IORef
import qualified Aws.Lambda.Runtime.ApiInfo as ApiInfo
import qualified Aws.Lambda.Runtime.Environment as Environment
import qualified Aws.Lambda.Runtime.Error as Error
data Context context = Context
{ memoryLimitInMb :: !Int
, functionName :: !String
, functionVersion :: !String
, invokedFunctionArn :: !String
, awsRequestId :: !String
, xrayTraceId :: !String
, logStreamName :: !String
, logGroupName :: !String
, deadline :: !Int
, customContext :: !(IORef context)
}
initialize
:: Throws Error.Parsing
=> Throws Error.EnvironmentVariableNotSet
=> IORef context
-> IO (Context context)
initialize customContextRef = do
functionName <- Environment.functionName
version <- Environment.functionVersion
logStream <- Environment.logStreamName
logGroup <- Environment.logGroupName
memoryLimitInMb <- Environment.functionMemory
pure $ Context
{ functionName = functionName
, functionVersion = version
, logStreamName = logStream
, logGroupName = logGroup
, memoryLimitInMb = memoryLimitInMb
, customContext = customContextRef
, invokedFunctionArn = mempty
, xrayTraceId = mempty
, awsRequestId = mempty
, deadline = 0
}
setEventData
:: Context context
-> ApiInfo.Event
-> IO (Context context)
setEventData context ApiInfo.Event{..} = do
Environment.setXRayTrace traceId
return $ context
{ invokedFunctionArn = invokedFunctionArn
, xrayTraceId = traceId
, awsRequestId = awsRequestId
, deadline = deadlineMs }