import Control.Monad.IO.Class
import Language.Haskell.LSP.Messages
-import Language.Haskell.LSP.Types
import Language.Haskell.LSP.Test
-import Language.Haskell.LSP.Test.Messages
-import Language.Haskell.LSP.Test.Session
-data State = State String (FromServerMessage -> Bool) [FromClientMessage] State
+data State = State String (FromServerMessage -> Bool) [Session ()] State
| Passed
| Failed
advance :: State -> Event -> Session State
advance _ Timeout = return Failed
-advance s@(State name f outMsgs next) (Received msg)
+advance s@(State name f actions next) (Received msg)
| f msg = do
liftIO $ putStrLn name
- mapM_ (handleClientMessage sendRequestMessage sendMessage sendMessage) outMsgs
+ sequence_ actions
return next
| otherwise = return s
advance s _ = return s
mkStates [] = Passed
mkStates ((n, f, msgs):xs) = State n f msgs (mkStates xs)
-main = let symbReq = ReqDocumentSymbols (RequestMessage "2.0" (IdInt 24) TextDocumentDocumentSymbol (DocumentSymbolParams (TextDocumentIdentifier (filePathToUri "/Users/luke/Desktop/test/src/Lib.hs"))))
- barPred (RspDocumentSymbols _) = True
- barPred _ = False
- encoded = [("start", const True, [symbReq])
- ,("silent", barPred, [])
- ,("end", const True, [])]
- initState = mkStates encoded
- in
- runSession "hie --lsp" "/Users/luke/Desktop/test" $ do
- openDoc "src/Lib.hs" "haskell"
+runMachine :: String -> [(String, FromServerMessage -> Bool, [Session ()])] -> IO String
+runMachine rootDir encodedStates =
+ runSession "hie --lsp" rootDir $ do
let f Passed = return Passed
f s = Received <$> anyMessage >>= advance s >>= f
+ initState = mkStates encodedStates
res <- f initState
case res of
Passed -> return "passed"