Skip to content

Commit d8e83ce

Browse files
committed
dmq-node: fixed LocalMsgNotification codec
* fixed decoding of `MsgReply` (blocking case) * refactored
1 parent 0c9707b commit d8e83ce

File tree

1 file changed

+31
-20
lines changed
  • dmq-node/src/DMQ/Protocol/LocalMsgNotification

1 file changed

+31
-20
lines changed

dmq-node/src/DMQ/Protocol/LocalMsgNotification/Codec.hs

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import Codec.CBOR.Decoding qualified as CBOR
1616
import Codec.CBOR.Encoding qualified as CBOR
1717
import Codec.CBOR.Read qualified as CBOR
1818
import Control.Monad.Class.MonadST
19+
import Data.Bool (bool)
1920
import Data.ByteString.Lazy (ByteString)
20-
import Data.Functor ((<&>))
2121
import Data.List.NonEmpty qualified as NonEmpty
2222
import Text.Printf
2323

@@ -78,13 +78,24 @@ codecLocalMsgNotification' mkWithBytes encodeMsg decodeMsgWithBytes =
7878
SingBlocking -> True
7979
SingNonBlocking -> False)
8080

81-
encode (MsgReply msgs hasMore) =
81+
encode (MsgReply msgs@NonBlockingReply{} hasMore) =
8282
CBOR.encodeListLen 3
8383
<> CBOR.encodeWord 1
8484
<> CBOR.encodeListLenIndef
85-
<> foldr (\msg r -> encodeMsg msg <> r)
86-
CBOR.encodeBreak
87-
msgs
85+
<> foldMap encodeMsg msgs
86+
<> CBOR.encodeBreak
87+
<> CBOR.encodeBool hasMore'
88+
where
89+
hasMore' = case hasMore of
90+
HasMore -> True
91+
DoesNotHaveMore -> False
92+
93+
encode (MsgReply msgs@BlockingReply{} hasMore) =
94+
CBOR.encodeListLen 3
95+
<> CBOR.encodeWord 2
96+
<> CBOR.encodeListLenIndef
97+
<> foldMap encodeMsg msgs
98+
<> CBOR.encodeBreak
8899
<> CBOR.encodeBool hasMore'
89100
where
90101
hasMore' = case hasMore of
@@ -93,7 +104,7 @@ codecLocalMsgNotification' mkWithBytes encodeMsg decodeMsgWithBytes =
93104

94105
encode MsgClientDone =
95106
CBOR.encodeListLen 1
96-
<> CBOR.encodeWord 2
107+
<> CBOR.encodeWord 3
97108

98109

99110
decode :: forall (st :: LocalMsgNotification msg).
@@ -104,31 +115,31 @@ codecLocalMsgNotification' mkWithBytes encodeMsg decodeMsgWithBytes =
104115
len <- CBOR.decodeListLen
105116
key <- CBOR.decodeWord
106117
case (stok, len, key) of
107-
(SingIdle, 1, 2) -> return (Annotator \_ -> SomeMessage MsgClientDone)
108118

109119
(SingIdle, 2, 0) -> do
110120
blocking <- CBOR.decodeBool
111121
return $! if blocking
112122
then Annotator \_ -> SomeMessage (MsgRequest SingBlocking)
113123
else Annotator \_ -> SomeMessage (MsgRequest SingNonBlocking)
114124

115-
(SingBusy blocking, 3, 1) -> do
125+
(SingBusy SingNonBlocking, 3, 1) -> do
126+
CBOR.decodeListLenIndef
127+
msgs <- CBOR.decodeSequenceLenIndef
128+
(flip (:)) [] reverse
129+
(Utils.decodeWithByteSpan decodeMsgWithBytes)
130+
more <- bool DoesNotHaveMore HasMore <$> CBOR.decodeBool
131+
return (Annotator \bytes -> SomeMessage $ MsgReply (NonBlockingReply $ mkWithBytes bytes <$> msgs) more)
132+
133+
(SingBusy SingBlocking, 3, 2) -> do
116134
CBOR.decodeListLenIndef
117135
msgs <- CBOR.decodeSequenceLenIndef
118136
(flip (:)) [] reverse
119137
(Utils.decodeWithByteSpan decodeMsgWithBytes)
120-
more <- CBOR.decodeBool <&> \case
121-
True -> HasMore
122-
False -> DoesNotHaveMore
123-
case (blocking, msgs) of
124-
(SingBlocking, _:_) ->
125-
return (Annotator \bytes ->
126-
SomeMessage $ MsgReply (BlockingReply (mkWithBytes bytes <$> NonEmpty.fromList msgs))
127-
more)
128-
(SingNonBlocking, _) ->
129-
return (Annotator \bytes -> SomeMessage $ MsgReply (NonBlockingReply $ mkWithBytes bytes <$> msgs) more)
130-
131-
(SingBlocking, []) -> fail "codecLocalMsgNotification: MsgReply: empty list not permitted"
138+
more <- bool DoesNotHaveMore HasMore <$> CBOR.decodeBool
139+
return (Annotator \bytes ->
140+
SomeMessage $ MsgReply (BlockingReply (mkWithBytes bytes <$> NonEmpty.fromList msgs)) more)
141+
142+
(SingIdle, 1, 3) -> return (Annotator \_ -> SomeMessage MsgClientDone)
132143

133144
(SingDone, _, _) -> notActiveState stok
134145

0 commit comments

Comments
 (0)