-- -- Copyright © 2014 Anchor Systems, Pty Ltd and Others -- -- The code in this file, and the program it is a part of, is -- made available to you by its authors as open source software: -- you can redistribute it and/or modify it under the terms of -- the 3-clause BSD licence. -- {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} module Chevalier.Types where import Control.Concurrent import Control.Exception import Data.Int (Int64) import Data.ProtocolBuffers hiding (field) import Data.Text (Text) import qualified Data.Text.Lazy as LT import Data.Typeable import Data.Word (Word64) import GHC.Generics (Generic) -- A request to the chevalier thread to search for a source by a single keyword data SourceQuery = SourceQuery { sourceRequest :: [SourceTag] , sourceAddress :: Text , sourcePage :: Integer , pageSize :: Integer , sourceOrigin :: Text , sourceResponse :: MVar (Either SomeException [LT.Text]) } -- Custom Exceptions data ChevalierException = BurstDecodeFailure String | ChevalierFailure Text deriving (Show, Typeable) instance Exception ChevalierException -- Protobufs follow data SourceTag = SourceTag { field :: Required 1 (Value Text) , value :: Required 2 (Value Text) } deriving (Generic, Eq, Show) instance Encode SourceTag instance Decode SourceTag data SourceRequest = SourceRequest { requestTags :: Repeated 1 (Message SourceTag) , startPage :: Optional 2 (Value Int64) , sourcesPerPage :: Optional 3 (Value Int64) , addressKey :: Optional 6 (Value (Fixed Word64)) } deriving (Generic, Eq, Show) instance Encode SourceRequest data SourceResponse = ChevalierResponse { sources :: Repeated 1 (Message Source) , chevalierError :: Optional 2 (Value Text) } deriving (Generic, Eq, Show) instance Decode SourceResponse data Source = Source { tags :: Repeated 1 (Message SourceTag) , address :: Required 3 (Value (Fixed Word64)) } deriving (Generic, Eq, Show) instance Decode Source