1 module Language.Haskell.LSP.Test.Server (withServer) where
3 import Control.Concurrent
4 import Control.Exception
6 import Language.Haskell.LSP.Test.Compat
10 withServer :: String -> Bool -> (Handle -> Handle -> Int -> IO a) -> IO a
11 withServer serverExe logStdErr f = do
12 -- TODO Probably should just change runServer to accept
13 -- separate command and arguments
14 let cmd:args = words serverExe
15 createProc = (proc cmd args) { std_in = CreatePipe, std_out = CreatePipe, std_err = CreatePipe }
16 (Just serverIn, Just serverOut, Just serverErr, serverProc) <- createProcess createProc
18 -- Need to continuously consume to stderr else it gets blocked
19 -- Can't pass NoStream either to std_err
20 hSetBuffering serverErr NoBuffering
21 errSinkThread <- forkIO $ forever $ hGetLine serverErr >>= when logStdErr . putStrLn
23 pid <- getProcessID serverProc
25 finally (f serverIn serverOut pid) $ do
26 killThread errSinkThread
27 terminateProcess serverProc