module Sync.MerkleTree.CommTypes where
import GHC.Generics
import Data.Set(Set)
import qualified Data.Text as T
import Data.Bytes.Serial
import Data.Time.Clock
import Data.ByteString(ByteString)
import Sync.MerkleTree.Types
import Sync.MerkleTree.Trie
class Monad m => Protocol m where
queryHashReq :: TrieLocation -> m Fingerprint
querySetReq :: TrieLocation -> m (Set Entry)
logReq :: T.Text -> m Bool
queryFileReq :: Path -> m QueryFileResponse
queryFileContReq :: ContHandle -> m QueryFileResponse
terminateReq :: m Bool
queryTime :: m UTCTime
data ContHandle = ContHandle Int
deriving (Generic)
instance Serial ContHandle
data ClientServerOptions
= ClientServerOptions
{ cs_add :: Bool
, cs_update :: Bool
, cs_delete :: Bool
, cs_ignore :: [FilePath]
, cs_compareClocks :: Maybe (Double, Double)
}
deriving (Read, Show)
data Request
= QuerySet TrieLocation
| QueryHash TrieLocation
| Log T.Text
| QueryFile Path
| QueryFileCont ContHandle
| Terminate
| QueryTime
deriving (Generic)
instance Serial Request
data QueryFileResponse
= Final
| ToBeContinued ByteString ContHandle
deriving (Generic)
instance Serial QueryFileResponse
data ProtocolVersion = ProtocolVersion !Int
deriving (Read, Show, Eq)
thisProtocolVersion :: ProtocolVersion
thisProtocolVersion = ProtocolVersion 4
data LaunchMessage
= LaunchMessage
{ lm_protocolVersion :: ProtocolVersion
, lm_dir :: FilePath
, lm_side :: Side
, lm_clientServerOptions :: ClientServerOptions
}
deriving (Read, Show)
data Side = Server | Client
deriving (Read, Show)