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