1 module Language.Haskell.LSP.Test.Server where
3 import Control.Concurrent
9 withServer :: String -> (Handle -> Handle -> Int -> IO a) -> IO a
10 withServer serverExe f = do
11 let createProc = (shell serverExe) { std_in = CreatePipe, std_out = CreatePipe, std_err = CreatePipe }
12 (Just serverIn, Just serverOut, Just serverErr, serverProc) <- createProcess createProc
14 -- Need to continuously consume to stderr else it gets blocked
15 -- Can't pass NoStream either to std_err
16 hSetBuffering serverErr NoBuffering
17 errSinkThread <- forkIO $ forever $ hGetLine serverErr
19 pid <- fromIntegral . fromJust <$> getPid serverProc
21 result <- f serverIn serverOut pid
23 killThread errSinkThread
24 terminateProcess serverProc