-{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
module Language.Haskell.LSP.Test.Parsing where
import Control.Monad.Trans.Reader
import Control.Monad.Trans.State
import Language.Haskell.LSP.Messages
-import Language.Haskell.LSP.Types
+import Language.Haskell.LSP.Types hiding (error)
import Language.Haskell.LSP.Test.Messages
import Language.Haskell.LSP.Test.Decoding
import System.IO
import Data.Conduit hiding (await)
import Data.Conduit.Parser
-data MessageParserState = MessageParserState
-
data SessionContext = SessionContext
{
serverIn :: Handle,
}
type ParserStateReader a s r m = ConduitParser a (StateT s (ReaderT r m))
+
-- | A session representing one instance of launching and connecting to a server.
--
-- You can send and receive messages to the server within 'Session' via 'getMessage',
type Session = ParserStateReader FromServerMessage SessionState SessionContext IO
-- | Matches if the message is a notification.
-notification :: Session FromServerMessage
+notification :: Monad m => ConduitParser FromServerMessage m FromServerMessage
notification = satisfy isServerNotification
-- | Matches if the message is a request.
-request :: Session FromServerMessage
+request :: Monad m => ConduitParser FromServerMessage m FromServerMessage
request = satisfy isServerRequest
-- | Matches if the message is a response.
-response :: Session FromServerMessage
+response :: Monad m => ConduitParser FromServerMessage m FromServerMessage
response = satisfy isServerResponse
-- | Matches if the message is a log message notification or a show message notification/request.
-loggingNotification :: Session FromServerMessage
+loggingNotification :: Monad m => ConduitParser FromServerMessage m FromServerMessage
loggingNotification = satisfy shouldSkip
where
shouldSkip (NotLogMessage _) = True
shouldSkip (ReqShowMessage _) = True
shouldSkip _ = False
+publishDiagnosticsNotification :: Monad m => ConduitParser FromServerMessage m PublishDiagnosticsNotification
+publishDiagnosticsNotification = do
+ NotPublishDiagnostics diags <- satisfy test
+ return diags
+ where test (NotPublishDiagnostics _) = True
+ test _ = False
+
satisfy :: Monad m => (a -> Bool) -> ConduitParser a m a
satisfy pred = do
x <- await