{-# LANGUAGE OverloadedRecordDot #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TemplateHaskell #-} import Data.ByteString (ByteString) import Data.Function ((&)) import Data.Text (Text, pack) import Effectful (Eff, (:>), runEff) import Effectful.Log (Log, localDomain, logInfo_, runLog) import Effectful.Reader.Static (runReader) import Effectful.Resource (runResource) import Hsm.Core.App (launch) import Hsm.Core.Env (deriveFromYaml) import Hsm.Core.Message (body) import Hsm.Core.Zmq.Client (receive, runClient) import Streamly.Data.Fold qualified as S (drain) import Streamly.Data.Stream qualified as S (Stream, fold, mapM) import System.IO.Echo (withoutInputEcho) data Env = Env { name :: Text , subEps :: [Text] , topics :: [Text] } $(deriveFromYaml ''Env) handle :: Log :> es => S.Stream (Eff es) ByteString -> Eff es () handle = S.fold S.drain . S.mapM handler where handler = localDomain "receiver" . logInfo_ . mappend "Received pulse #" . pack . show . body @Int -- Dummy receiver service: -- Proof of concept. Listens for "pulses" through ZMQ and logs each time one -- is received. main :: IO () main = launch @Env "dummy-receiver" withoutInputEcho $ \env logger level -> (receive & handle) & runClient @Env & runLog env.name logger level & runReader env & runResource & runEff