packages feed

azure-functions-worker-0.0.0.0: src/Azure/Functions/Bindings/Class.hs

-- {-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeApplications      #-}
{-# LANGUAGE TypeFamilies          #-}
module Azure.Functions.Bindings.Class
where

import Data.Aeson                            (ToJSON, Value (Null))
import Data.ProtoLens.Runtime.Data.ProtoLens (defMessage)
import Data.Proxy                            (Proxy)
import Data.Text                             (Text)
import GHC.Generics                          (Generic)
import Lens.Family                           ((&), (.~))
import Proto.FunctionRpc
import Proto.FunctionRpc_Fields

class ToInBinding ctx where
  toInBindingJSON :: ctx -> Value

class ToOutBinding ctx where
  toOutBindingJSON :: ctx -> Value

class (ToInBinding (InBinding a)) => InMessage a where
  type InBinding a :: *
  fromInvocationRequest :: InvocationRequest -> Either Text a

class (ToOutBinding (OutBinding a)) => OutMessage a where
  type OutBinding a
  toInvocationResponse :: a -> InvocationResponse

instance OutMessage () where
  type OutBinding () = ()
  toInvocationResponse _ =
    defMessage @InvocationResponse
      & result .~ (defMessage & status .~ StatusResult'Success)

instance ToOutBinding () where
  toOutBindingJSON _ = Null