module Neovim.Debug (
debug,
debug',
develMain,
quitDevelMain,
restartDevelMain,
runNeovim,
runNeovim',
module Neovim,
) where
import Neovim
import Neovim.Context (runNeovim)
import qualified Neovim.Context.Internal as Internal
import Neovim.Log (disableLogger)
import Neovim.Main (CommandLineOptions (..),
runPluginProvider)
import Neovim.RPC.Common (RPCConfig)
import Control.Concurrent
import Control.Monad
import Foreign.Store
import Prelude
debug :: r -> st -> Internal.Neovim r st a -> IO (Either String (a, st))
debug r st a = disableLogger $ do
runPluginProvider def { env = True } Nothing transitionHandler Nothing
where
transitionHandler tids cfg = takeMVar (Internal.transitionTo cfg) >>= \case
Internal.Failure e ->
return $ Left e
Internal.InitSuccess -> do
res <- Internal.runNeovim
(cfg { Internal.customConfig = r, Internal.pluginSettings = Nothing })
st
a
mapM_ killThread tids
return res
_ ->
return $ Left "Unexpected transition state."
debug' :: Internal.Neovim' a -> IO (Either String a)
debug' a = fmap fst <$> debug () () a
develMain
:: Maybe NeovimConfig
-> IO (Either String ([ThreadId], Internal.Config RPCConfig ()))
develMain mcfg = lookupStore 0 >>= \case
Nothing -> do
x <- disableLogger $
runPluginProvider def { env = True } mcfg transitionHandler Nothing
void $ newStore x
return x
Just x ->
readStore x
where
transitionHandler tids cfg = takeMVar (Internal.transitionTo cfg) >>= \case
Internal.Failure e ->
return $ Left e
Internal.InitSuccess -> do
transitionHandlerThread <- forkIO $ do
myTid <- myThreadId
void $ transitionHandler (myTid:tids) cfg
return $ Right (transitionHandlerThread:tids, cfg)
Internal.Quit -> do
lookupStore 0 >>= \case
Nothing ->
return ()
Just x ->
deleteStore x
mapM_ killThread tids
return $ Left "Quit develMain"
_ ->
return $ Left "Unexpected transition state for develMain."
quitDevelMain :: Internal.Config r st -> IO ()
quitDevelMain cfg = putMVar (Internal.transitionTo cfg) Internal.Quit
restartDevelMain
:: Internal.Config RPCConfig ()
-> Maybe NeovimConfig
-> IO (Either String ([ThreadId], Internal.Config RPCConfig ()))
restartDevelMain cfg mcfg = do
quitDevelMain cfg
develMain mcfg
runNeovim' :: Internal.Config r st -> Neovim' a -> IO (Either String a)
runNeovim' cfg =
fmap (fmap fst) . runNeovim (Internal.retypeConfig () () cfg) ()