65011fd3f106b0947243590c8b86af6b014dffd6
[opengl.git] / src / Language / Haskell / LSP / Test / Server.hs
1 module Language.Haskell.LSP.Test.Server where
2
3 import Control.Concurrent
4 import Control.Monad
5 import Data.Maybe
6 import System.IO
7 import System.Process
8
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
13
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
18   
19   pid <- fromIntegral . fromJust <$> getPid serverProc
20
21   result <- f serverIn serverOut pid
22
23   killThread errSinkThread
24   terminateProcess serverProc
25   return result