chromatin-0.1.1.0: lib/Chromatin/Rebuild/Init.hs
module Chromatin.Rebuild.Init(
initializeRplugins,
) where
import Control.Monad (when)
import Data.Default.Class (def)
import Data.Foldable (traverse_)
import Data.Functor (void)
import Data.Maybe (catMaybes)
import Data.Strings (strCapitalize)
import Neovim (NeovimException, vim_call_function)
import Ribosome.Api.Exists (waitForFunction)
import qualified Ribosome.Api.Exists as Exists (function)
import Chromatin.Data.ActiveRplugin (ActiveRplugin(ActiveRplugin))
import Chromatin.Data.Chromatin (Chromatin)
import Ribosome.Data.Errors (ComponentName(ComponentName))
import Chromatin.Data.Rplugin (Rplugin(Rplugin))
import Chromatin.Data.RpluginName (RpluginName(RpluginName))
import Chromatin.Env (logError)
activeRpluginName :: ActiveRplugin -> String
activeRpluginName (ActiveRplugin _ (Rplugin (RpluginName rpluginName) _)) = rpluginName
pluginRpcName :: String -> ActiveRplugin -> String
pluginRpcName rpcName rplugin =
strCapitalize (activeRpluginName rplugin) ++ rpcName
waitForPlugin :: ActiveRplugin -> Chromatin (Maybe ActiveRplugin)
waitForPlugin rplugin = do
result <- waitForFunction (pluginRpcName "Poll" rplugin) def
return $ case result of
Right _ -> Just rplugin
Left _ -> Nothing
stageError :: ActiveRplugin -> Int -> NeovimException -> Chromatin ()
stageError rplugin stage err =
logError (ComponentName "rebuild-init") $ "error in stage " ++ show stage ++ " of `" ++ name ++ "`" ++ show err
where
name = activeRpluginName rplugin
runStage :: ActiveRplugin -> Int -> String -> Chromatin ()
runStage rplugin stage func = do
result <- void <$> vim_call_function func []
either (stageError rplugin stage) return result
runStageInRpluginIfExists :: Int -> ActiveRplugin -> Chromatin ()
runStageInRpluginIfExists stage rplugin = do
exists <- Exists.function func
when exists $ runStage rplugin stage func
where
func = pluginRpcName ("Stage" ++ show stage) rplugin
runStageInRplugins :: [ActiveRplugin] -> Int -> Chromatin ()
runStageInRplugins rplugins stage =
traverse_ (runStageInRpluginIfExists stage) rplugins
runStages :: [ActiveRplugin] -> Chromatin ()
runStages rplugins =
traverse_ (runStageInRplugins rplugins) [1..5]
initializeRplugins :: [ActiveRplugin] -> Chromatin ()
initializeRplugins rplugins = do
results <- traverse waitForPlugin rplugins
let crmPlugins = catMaybes results
runStages crmPlugins