Swap out UUIDs based on process ID
[lsp-test.git] / src / Language / Haskell / LSP / Test / Server.hs
diff --git a/src/Language/Haskell/LSP/Test/Server.hs b/src/Language/Haskell/LSP/Test/Server.hs
new file mode 100644 (file)
index 0000000..65011fd
--- /dev/null
@@ -0,0 +1,25 @@
+module Language.Haskell.LSP.Test.Server where
+
+import Control.Concurrent
+import Control.Monad
+import Data.Maybe
+import System.IO
+import System.Process
+
+withServer :: String -> (Handle -> Handle -> Int -> IO a) -> IO a
+withServer serverExe f = do
+  let createProc = (shell serverExe) { std_in = CreatePipe, std_out = CreatePipe, std_err = CreatePipe }
+  (Just serverIn, Just serverOut, Just serverErr, serverProc) <- createProcess createProc
+
+  -- Need to continuously consume to stderr else it gets blocked
+  -- Can't pass NoStream either to std_err
+  hSetBuffering serverErr NoBuffering
+  errSinkThread <- forkIO $ forever $ hGetLine serverErr
+  
+  pid <- fromIntegral . fromJust <$> getPid serverProc
+
+  result <- f serverIn serverOut pid
+
+  killThread errSinkThread
+  terminateProcess serverProc
+  return result
\ No newline at end of file