ihp-ide-1.4.0: IHP/IDE/Types.hs
module IHP.IDE.Types where
import ClassyPrelude
import System.Process.Internals
import qualified System.Process as Process
import qualified GHC.IO.Handle as Handle
import qualified Network.WebSockets as Websocket
import qualified Data.ByteString.Char8 as ByteString
import IHP.IDE.PortConfig
import Data.String.Conversions (cs)
import Data.UUID
import qualified IHP.Log.Types as Log
import qualified IHP.Log as Log
import qualified Data.ByteString.Builder as ByteString
import qualified Control.Concurrent.Chan.Unagi as Queue
procDirenvAware :: (?context :: Context) => FilePath -> [String] -> Process.CreateProcess
procDirenvAware command args =
if ?context.wrapWithDirenv
then Process.proc "direnv" (["exec", ".", command] <> args)
else Process.proc command args
sendGhciCommand :: (?context :: Context) => Handle -> ByteString -> IO ()
sendGhciCommand inputHandle command = do
when (isDebugMode ?context) (Log.debug ("GHCI: " <> cs command :: Text))
ByteString.hPutStrLn inputHandle command
Handle.hFlush inputHandle
sendGhciCommands :: (?context :: Context) => Handle -> [ByteString] -> IO ()
sendGhciCommands handle commands = forM_ commands (sendGhciCommand handle)
data OutputLine = StandardOutput !ByteString | ErrorOutput !ByteString deriving (Show, Eq)
data Context = Context
{ portConfig :: !PortConfig
, isDebugMode :: !Bool
, logger :: !Log.Logger
, ghciInChan :: !(Queue.InChan OutputLine) -- ^ Output of the app ghci is written here
, ghciOutChan :: !(Queue.OutChan OutputLine) -- ^ Output of the app ghci is consumed here
, liveReloadClients :: !(IORef (Map UUID Websocket.Connection))
, wrapWithDirenv :: !Bool
, lastSchemaCompilerError :: !(IORef (Maybe SomeException))
}