diff options
author | Sam Truzjan <pxqr.sta@gmail.com> | 2013-12-20 00:03:39 +0400 |
---|---|---|
committer | Sam Truzjan <pxqr.sta@gmail.com> | 2013-12-20 00:03:39 +0400 |
commit | 53d384bd0028cbb54053e11b49fe0673257b7c45 (patch) | |
tree | 3f3197fa418c169032d684a8d782522f1ebce261 /src/Network/KRPC/Message.hs | |
parent | 8cae1905ed3c71702569bfb191f8bf6bae772821 (diff) |
Handle transactions properly
Diffstat (limited to 'src/Network/KRPC/Message.hs')
-rw-r--r-- | src/Network/KRPC/Message.hs | 47 |
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 #-} |
21 | module Network.KRPC.Message | 21 | module 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 | ||
35 | import Control.Applicative | 45 | import 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. |
48 | type TransactionId = ByteString | 58 | type TransactionId = ByteString |
49 | 59 | ||
60 | unknownTransaction :: TransactionId | ||
61 | unknownTransaction = "" | ||
62 | |||
50 | {----------------------------------------------------------------------- | 63 | {----------------------------------------------------------------------- |
51 | -- Error messages | 64 | -- Error messages |
52 | -----------------------------------------------------------------------} | 65 | -----------------------------------------------------------------------} |
@@ -120,6 +133,15 @@ instance Exception KError | |||
120 | serverError :: SomeException -> TransactionId -> KError | 133 | serverError :: SomeException -> TransactionId -> KError |
121 | serverError e = KError ServerError (BC.pack (show e)) | 134 | serverError e = KError ServerError (BC.pack (show e)) |
122 | 135 | ||
136 | decodeError :: String -> TransactionId -> KError | ||
137 | decodeError msg = KError ProtocolError (BC.pack msg) | ||
138 | |||
139 | unknownMethod :: MethodName -> TransactionId -> KError | ||
140 | unknownMethod = KError MethodUnknown | ||
141 | |||
142 | unknownMessage :: String -> KError | ||
143 | unknownMessage 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 | |||
214 | data KMessage | ||
215 | = Q KQuery | ||
216 | | R KResponse | ||
217 | | E KError | ||
218 | |||
219 | instance 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 | ||