module Hbro.IPC where
import Hbro.Util
import Control.Lens hiding(Context)
import Control.Monad.Base
import Data.ByteString.Char8 (pack, unpack)
import Data.Functor
import Data.Map (Map)
import Prelude hiding(log, mapM_, read)
import System.ZMQ3 hiding(close, context, init, message, receive, send, socket)
import qualified System.ZMQ3 as ZMQ (receive, send)
data IPC = IPC {
_context :: Context,
_receiver :: Socket Rep}
class IPCReader m where
readIPC :: Simple Lens IPC a -> m a
makeLenses ''IPC
newtype CommandsMap m = CommandsMap { unwrap :: Map String ([String] -> m String) }
send :: (MonadBase IO m, Sender a) => Socket a -> String -> m ()
send socket payload = io $ ZMQ.send socket [] (pack payload)
read :: (MonadBase IO m, Receiver a) => Socket a -> m String
read socket = io $ unpack <$> ZMQ.receive socket
sendCommand :: (MonadBase IO m, IPCReader m) => String -> String -> m String
sendCommand socketURI command = do
theContext <- readIPC context
io $ withSocket theContext Req $ \socket -> do
connect socket socketURI
send socket command
read socket