1 module Language.Haskell.LSP.Test.Server (withServer) where
3 import Control.Concurrent.Async
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