+response :: forall m a. (MonadIO m, MonadSessionConfig m, FromJSON a) => ConduitParser FromServerMessage m (ResponseMessage a)
+response = named "Response" $ do
+ let parser = decode . encodeMsg :: FromServerMessage -> Maybe (ResponseMessage a)
+ x <- satisfy (isJust . parser)
+ return $ castMsg x
+
+-- | A stupid method for getting out the inner message.
+castMsg :: FromJSON a => FromServerMessage -> a
+castMsg = fromMaybe (error "Failed casting a message") . decode . encodeMsg
+
+-- | A version of encode that encodes FromServerMessages as if they
+-- weren't wrapped.
+encodeMsg :: FromServerMessage -> B.ByteString
+encodeMsg = encode . genericToJSON (defaultOptions { sumEncoding = UntaggedValue })
+
+-- | Matches if the message is a log message notification or a show message notification/request.
+loggingNotification :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage
+loggingNotification = named "Logging notification" $ satisfy shouldSkip
+ where
+ shouldSkip (NotLogMessage _) = True
+ shouldSkip (NotShowMessage _) = True
+ shouldSkip (ReqShowMessage _) = True
+ shouldSkip _ = False
+
+publishDiagnosticsNotification :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m PublishDiagnosticsNotification
+publishDiagnosticsNotification = named "Publish diagnostics notification" $ do
+ NotPublishDiagnostics diags <- satisfy test
+ return diags
+ where test (NotPublishDiagnostics _) = True
+ test _ = False
\ No newline at end of file