{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Proto.FunctionRpc_Helpers
where
import Data.ProtoLens.Runtime.Data.ProtoLens (defMessage)
import Data.Text (Text)
import Lens.Family ((&), (.~), (^.))
import Proto.FunctionRpc
import Proto.FunctionRpc_Fields
class ToStreamingMessageContent a where
toStreamingMessageContent :: a -> StreamingMessage'Content
instance ToStreamingMessageContent WorkerInitResponse where
toStreamingMessageContent = StreamingMessage'WorkerInitResponse
instance ToStreamingMessageContent FunctionLoadResponse where
toStreamingMessageContent = StreamingMessage'FunctionLoadResponse
instance ToStreamingMessageContent InvocationResponse where
toStreamingMessageContent = StreamingMessage'InvocationResponse
instance ToStreamingMessageContent FunctionEnvironmentReloadResponse where
toStreamingMessageContent = StreamingMessage'FunctionEnvironmentReloadResponse
instance ToStreamingMessageContent WorkerStatusResponse where
toStreamingMessageContent = StreamingMessage'WorkerStatusResponse
instance ToStreamingMessageContent WorkerActionResponse where
toStreamingMessageContent = StreamingMessage'WorkerActionResponse
instance ToStreamingMessageContent WorkerHeartbeat where
toStreamingMessageContent = StreamingMessage'WorkerHeartbeat
instance ToStreamingMessageContent RpcLog where
toStreamingMessageContent = StreamingMessage'RpcLog
toResponse :: ToStreamingMessageContent a
=> StreamingMessage
-> a
-> StreamingMessage
toResponse req resp =
defMessage
& requestId .~ (req ^. requestId)
& maybe'content .~ Just (toStreamingMessageContent resp)
toResponseLogError :: ToStreamingMessageContent a
=> StreamingMessage
-> Either Text a
-> StreamingMessage
toResponseLogError req resp = toResponseLogError' req id resp
toResponseLogError' :: ToStreamingMessageContent a
=> StreamingMessage
-> (RpcLog -> RpcLog)
-> Either Text a
-> StreamingMessage
toResponseLogError' req updateLog resp =
let content = either (toStreamingMessageContent . updateLog . rpcLogError) toStreamingMessageContent resp
in defMessage
& requestId .~ (req ^. requestId)
& maybe'content .~ Just content
rpcLogMessage :: RpcLog'Level -> Text -> RpcLog
rpcLogMessage lvl msg =
defMessage
& level .~ lvl
& message .~ msg
rpcLogInfo :: Text -> RpcLog
rpcLogInfo = rpcLogMessage RpcLog'Information
rpcLogError :: Text -> RpcLog
rpcLogError = rpcLogMessage RpcLog'Error
successStatus :: Text -> StatusResult
successStatus msg =
defMessage @StatusResult
& status .~ StatusResult'Success
& result .~ msg
& logs .~ [
rpcLogInfo msg
]
& exception .~ (
defMessage @RpcException
& message .~ msg
)
failureStatus :: Text -> StatusResult
failureStatus msg =
defMessage @StatusResult
& status .~ StatusResult'Failure
& result .~ msg
& logs .~ [
rpcLogError msg
]
& exception .~ (
defMessage @RpcException
& message .~ msg
)