import Control.Concurrent.Chan
import Control.Concurrent.MVar
import Control.Monad.Trans.Class
-import Control.Monad.IO.Class
import Control.Monad.Trans.Reader
import Control.Monad.Trans.State
import Data.Aeson
import Data.Conduit.Parser
import Data.Maybe
import Language.Haskell.LSP.Messages
-import Language.Haskell.LSP.Types
+import Language.Haskell.LSP.Types hiding (error)
import Language.Haskell.LSP.Test.Compat
import Language.Haskell.LSP.Test.Decoding
import Language.Haskell.LSP.Test.Messages
notification = do
let parser = decode . encodeMsg :: FromServerMessage -> Maybe (NotificationMessage ServerMethod a)
x <- satisfy (isJust . parser)
- return $ fromJust $ decode $ encodeMsg x
+ return $ decodeMsg $ encodeMsg x
-- | Matches if the message is a request.
anyRequest :: Monad m => ConduitParser FromServerMessage m FromServerMessage
request = do
let parser = decode . encodeMsg :: FromServerMessage -> Maybe (RequestMessage ServerMethod a b)
x <- satisfy (isJust . parser)
- return $ fromJust $ decode $ encodeMsg x
+ return $ decodeMsg $ encodeMsg x
-- | Matches if the message is a response.
anyResponse :: Monad m => ConduitParser FromServerMessage m FromServerMessage
response = do
let parser = decode . encodeMsg :: FromServerMessage -> Maybe (ResponseMessage a)
x <- satisfy (isJust . parser)
- return $ fromJust $ decode $ encodeMsg x
+ return $ decodeMsg $ encodeMsg x
-- | A version of encode that encodes FromServerMessages as if they
-- weren't wrapped.
encodeMsg :: FromServerMessage -> B.ByteString
encodeMsg = encode . genericToJSON (defaultOptions { sumEncoding = UntaggedValue })
+decodeMsg :: FromJSON a => B.ByteString -> a
+decodeMsg x = fromMaybe (error $ "Unexpected message type\nGot:\n " ++ show x)
+ (decode x)
+
-- | Matches if the message is a log message notification or a show message notification/request.
loggingNotification :: Monad m => ConduitParser FromServerMessage m FromServerMessage
loggingNotification = satisfy shouldSkip