summaryrefslogtreecommitdiff
path: root/libraries/libiserv/src/Remote/Message.hs
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/libiserv/src/Remote/Message.hs')
-rw-r--r--libraries/libiserv/src/Remote/Message.hs38
1 files changed, 38 insertions, 0 deletions
diff --git a/libraries/libiserv/src/Remote/Message.hs b/libraries/libiserv/src/Remote/Message.hs
new file mode 100644
index 0000000000..f1745301ba
--- /dev/null
+++ b/libraries/libiserv/src/Remote/Message.hs
@@ -0,0 +1,38 @@
+{-# LANGUAGE GADTs, StandaloneDeriving, ExistentialQuantification #-}
+
+module Remote.Message
+ ( SlaveMessage(..)
+ , SlaveMsg(..)
+ , putSlaveMessage
+ , getSlaveMessage )
+where
+
+import GHC.Fingerprint (Fingerprint)
+import Data.Binary
+import Data.ByteString (ByteString)
+
+-- | A @SlaveMessage a@ is message from the iserv process on the
+-- target, requesting something from the Proxy of with result type @a@.
+data SlaveMessage a where
+ -- sends either a new file, or nothing if the file is acceptable.
+ Have :: FilePath -> Fingerprint -> SlaveMessage (Maybe ByteString)
+ Missing :: FilePath -> SlaveMessage ByteString
+ Done :: SlaveMessage ()
+
+deriving instance Show (SlaveMessage a)
+
+putSlaveMessage :: SlaveMessage a -> Put
+putSlaveMessage m = case m of
+ Have path sha -> putWord8 0 >> put path >> put sha
+ Missing path -> putWord8 1 >> put path
+ Done -> putWord8 2
+
+data SlaveMsg = forall a . (Binary a, Show a) => SlaveMsg (SlaveMessage a)
+
+getSlaveMessage :: Get SlaveMsg
+getSlaveMessage = do
+ b <- getWord8
+ case b of
+ 0 -> SlaveMsg <$> (Have <$> get <*> get)
+ 1 -> SlaveMsg <$> Missing <$> get
+ 2 -> return (SlaveMsg Done)