-- | Provides all the values out of
-- the environment variables of the system
module Aws.Lambda.Runtime.Environment
  ( functionMemory,
    apiEndpoint,
    handlerName,
    taskRoot,
    functionName,
    functionVersion,
    logStreamName,
    logGroupName,
    setXRayTrace,
  )
where

import qualified Aws.Lambda.Runtime.Error as Error
import Control.Exception.Safe.Checked (Throws, throw)
import Data.Text (Text, pack, unpack)
import qualified System.Environment as Environment
import qualified Text.Read as Read

logGroupName :: Throws Error.EnvironmentVariableNotSet => IO Text
logGroupName :: Throws EnvironmentVariableNotSet => IO Text
logGroupName =
  Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
"AWS_LAMBDA_LOG_GROUP_NAME"

logStreamName :: Throws Error.EnvironmentVariableNotSet => IO Text
logStreamName :: Throws EnvironmentVariableNotSet => IO Text
logStreamName =
  Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
"AWS_LAMBDA_LOG_STREAM_NAME"

functionVersion :: Throws Error.EnvironmentVariableNotSet => IO Text
functionVersion :: Throws EnvironmentVariableNotSet => IO Text
functionVersion =
  Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
"AWS_LAMBDA_FUNCTION_VERSION"

functionName :: Throws Error.EnvironmentVariableNotSet => IO Text
functionName :: Throws EnvironmentVariableNotSet => IO Text
functionName =
  Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
"AWS_LAMBDA_FUNCTION_NAME"

setXRayTrace :: Text -> IO ()
setXRayTrace :: Text -> IO ()
setXRayTrace = String -> String -> IO ()
Environment.setEnv String
"_X_AMZN_TRACE_ID" forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
unpack

taskRoot :: Throws Error.EnvironmentVariableNotSet => IO Text
taskRoot :: Throws EnvironmentVariableNotSet => IO Text
taskRoot =
  Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
"LAMBDA_TASK_ROOT"

handlerName :: Throws Error.EnvironmentVariableNotSet => IO Text
handlerName :: Throws EnvironmentVariableNotSet => IO Text
handlerName =
  Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
"_HANDLER"

apiEndpoint :: Throws Error.EnvironmentVariableNotSet => IO Text
apiEndpoint :: Throws EnvironmentVariableNotSet => IO Text
apiEndpoint =
  Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
"AWS_LAMBDA_RUNTIME_API"

functionMemory :: Throws Error.Parsing => Throws Error.EnvironmentVariableNotSet => IO Int
functionMemory :: (Throws Parsing, Throws EnvironmentVariableNotSet) => IO Int
functionMemory = do
  let envVar :: Text
envVar = Text
"AWS_LAMBDA_FUNCTION_MEMORY_SIZE"
  Text
memoryValue <- Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
envVar
  case forall a. Read a => String -> Maybe a
Read.readMaybe (Text -> String
unpack Text
memoryValue) of
    Just Int
value -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
value
    Maybe Int
Nothing -> forall (m :: * -> *) e a.
(MonadThrow m, Exception e, Throws e) =>
e -> m a
throw (Text -> Text -> Text -> Parsing
Error.Parsing Text
envVar Text
memoryValue Text
envVar)

readEnvironmentVariable :: Throws Error.EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable :: Throws EnvironmentVariableNotSet => Text -> IO Text
readEnvironmentVariable Text
envVar = do
  Maybe String
v <- String -> IO (Maybe String)
Environment.lookupEnv (Text -> String
unpack Text
envVar)
  case Maybe String
v of
    Just String
value -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
pack forall a b. (a -> b) -> a -> b
$ String
value
    Maybe String
Nothing -> forall (m :: * -> *) e a.
(MonadThrow m, Exception e, Throws e) =>
e -> m a
throw (Text -> EnvironmentVariableNotSet
Error.EnvironmentVariableNotSet Text
envVar)