0a77a6193e6fb9c320531e65f74255576bccf8f4
[lsp-test.git] / src / Language / Haskell / LSP / Test / Server.hs
1 module Language.Haskell.LSP.Test.Server (withServer) where
2
3 import Control.Concurrent.Async
4 import Control.Monad
5 import System.IO
6 import System.Process
7
8 withServer :: String -> Bool -> (Handle -> Handle -> ProcessHandle -> IO a) -> IO a
9 withServer serverExe logStdErr f = do
10   -- TODO Probably should just change runServer to accept
11   -- separate command and arguments
12   let cmd:args = words serverExe
13       createProc = (proc cmd args) { std_in = CreatePipe, std_out = CreatePipe, std_err = CreatePipe }
14   withCreateProcess createProc $ \(Just serverIn) (Just serverOut) (Just serverErr) serverProc -> do
15     -- Need to continuously consume to stderr else it gets blocked
16     -- Can't pass NoStream either to std_err
17     hSetBuffering serverErr NoBuffering
18     hSetBinaryMode serverErr True
19     let errSinkThread = forever $ hGetLine serverErr >>= when logStdErr . putStrLn
20     withAsync errSinkThread $ \_ -> do
21       f serverIn serverOut serverProc