summaryrefslogtreecommitdiff
path: root/src/Network/KRPC/Message.hs
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2013-12-20 00:03:39 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2013-12-20 00:03:39 +0400
commit53d384bd0028cbb54053e11b49fe0673257b7c45 (patch)
tree3f3197fa418c169032d684a8d782522f1ebce261 /src/Network/KRPC/Message.hs
parent8cae1905ed3c71702569bfb191f8bf6bae772821 (diff)
Handle transactions properly
Diffstat (limited to 'src/Network/KRPC/Message.hs')
-rw-r--r--src/Network/KRPC/Message.hs47
1 files changed, 44 insertions, 3 deletions
diff --git a/src/Network/KRPC/Message.hs b/src/Network/KRPC/Message.hs
index a70c2ea9..3bbfb1db 100644
--- a/src/Network/KRPC/Message.hs
+++ b/src/Network/KRPC/Message.hs
@@ -19,10 +19,17 @@
19{-# LANGUAGE DefaultSignatures #-} 19{-# LANGUAGE DefaultSignatures #-}
20{-# LANGUAGE DeriveDataTypeable #-} 20{-# LANGUAGE DeriveDataTypeable #-}
21module Network.KRPC.Message 21module Network.KRPC.Message
22 ( -- * Error 22 ( -- * Transaction
23 ErrorCode (..) 23 TransactionId
24 , unknownTransaction
25
26 -- * Error
27 , ErrorCode (..)
24 , KError(..) 28 , KError(..)
25 , serverError 29 , serverError
30 , decodeError
31 , unknownMethod
32 , unknownMessage
26 33
27 -- * Query 34 -- * Query
28 , KQuery(..) 35 , KQuery(..)
@@ -30,6 +37,9 @@ module Network.KRPC.Message
30 37
31 -- * Response 38 -- * Response
32 , KResponse(..) 39 , KResponse(..)
40
41 -- * Message
42 , KMessage (..)
33 ) where 43 ) where
34 44
35import Control.Applicative 45import Control.Applicative
@@ -47,6 +57,9 @@ import Data.Typeable
47-- are enough as they cover 2^16 outstanding queries. 57-- are enough as they cover 2^16 outstanding queries.
48type TransactionId = ByteString 58type TransactionId = ByteString
49 59
60unknownTransaction :: TransactionId
61unknownTransaction = ""
62
50{----------------------------------------------------------------------- 63{-----------------------------------------------------------------------
51-- Error messages 64-- Error messages
52-----------------------------------------------------------------------} 65-----------------------------------------------------------------------}
@@ -120,6 +133,15 @@ instance Exception KError
120serverError :: SomeException -> TransactionId -> KError 133serverError :: SomeException -> TransactionId -> KError
121serverError e = KError ServerError (BC.pack (show e)) 134serverError e = KError ServerError (BC.pack (show e))
122 135
136decodeError :: String -> TransactionId -> KError
137decodeError msg = KError ProtocolError (BC.pack msg)
138
139unknownMethod :: MethodName -> TransactionId -> KError
140unknownMethod = KError MethodUnknown
141
142unknownMessage :: String -> KError
143unknownMessage msg = KError ProtocolError (BC.pack msg) ""
144
123{----------------------------------------------------------------------- 145{-----------------------------------------------------------------------
124-- Query messages 146-- Query messages
125-----------------------------------------------------------------------} 147-----------------------------------------------------------------------}
@@ -183,4 +205,23 @@ instance BEncode KResponse where
183 fromBEncode = fromDict $ do 205 fromBEncode = fromDict $ do
184 lookAhead $ match "y" (BString "r") 206 lookAhead $ match "y" (BString "r")
185 KResponse <$>! "r" <*>! "t" 207 KResponse <$>! "r" <*>! "t"
186 {-# INLINE fromBEncode #-} \ No newline at end of file 208 {-# INLINE fromBEncode #-}
209
210{-----------------------------------------------------------------------
211-- Summed messages
212-----------------------------------------------------------------------}
213
214data KMessage
215 = Q KQuery
216 | R KResponse
217 | E KError
218
219instance BEncode KMessage where
220 toBEncode (Q q) = toBEncode q
221 toBEncode (R r) = toBEncode r
222 toBEncode (E e) = toBEncode e
223
224 fromBEncode b =
225 Q <$> fromBEncode b
226 <|> R <$> fromBEncode b
227 <|> E <$> fromBEncode b