module Proteome.Init(
initialize,
proteomeStage2,
proteomeStage4,
) where
import Control.Monad.Reader
import Data.Default.Class (Default(def))
import System.Directory (getCurrentDirectory, makeAbsolute)
import System.FilePath (takeFileName, takeDirectory)
import System.Log.Logger (updateGlobalLogger, setLevel, Priority(ERROR))
import Control.Monad.IO.Class (MonadIO)
import Neovim (Neovim)
import UnliftIO.STM (TVar, newTVarIO)
import Ribosome.Config.Settings (setting, settingE, updateSetting)
import Ribosome.Data.Ribo (Ribo)
import qualified Ribosome.Data.Ribo as Ribo (inspect)
import Ribosome.Data.Ribosome (Ribosome(Ribosome))
import Ribosome.File (canonicalPaths)
import Ribosome.Internal.IO (retypeNeovim)
import Proteome.Data.Env (Env(Env))
import qualified Proteome.Data.Env as Env (mainProject)
import Proteome.Data.Proteome
import Proteome.Data.Project (
Project(meta),
ProjectName(..),
ProjectRoot(..),
ProjectType(..),
ProjectMetadata(DirProject),
)
import Proteome.Project.Resolve (resolveProject)
import Proteome.Config (readConfig)
import Proteome.Log
import qualified Proteome.Settings as S
pathData :: MonadIO m => Either String FilePath -> m (ProjectRoot, ProjectName, ProjectType)
pathData override = do
cwd <- liftIO $ either (const getCurrentDirectory) pure override
absMainDir <- liftIO $ makeAbsolute cwd
return (
ProjectRoot absMainDir,
ProjectName $ takeFileName absMainDir,
ProjectType $ (takeFileName . takeDirectory) absMainDir
)
mainProject :: Ribo e Project
mainProject = do
mainDir <- settingE S.mainProjectDir
(root, name, tpe) <- pathData mainDir
baseDirs <- (canonicalPaths <=< setting) S.projectBaseDirs
explicit <- setting S.projects
config <- setting S.projectConfig
return $ resolveProject baseDirs explicit config root name (Just tpe)
loadPersistedBuffers :: Project -> Neovim e ()
loadPersistedBuffers _ = return ()
updateMainType :: Maybe ProjectType -> Ribo e ()
updateMainType (Just tpe) = updateSetting S.mainType tpe
updateMainType Nothing = return ()
setProjectVars :: ProjectMetadata -> Ribo e ()
setProjectVars (DirProject name _ tpe) = do
updateSetting S.mainName name
updateMainType tpe
setProjectVars _ = return ()
initWithMain :: Project -> Ribo e Env
initWithMain main = do
debugS $ "initializing with main project: " ++ show main
loadPersistedBuffers main
setProjectVars (meta main)
return $ Env main [] def
initialize' :: Ribo e Env
initialize' = do
main <- mainProject
initWithMain main
initialize :: Neovim e (TVar Env)
initialize = do
liftIO $ updateGlobalLogger "Neovim.Plugin" (setLevel ERROR)
env <- retypeNeovim (Ribosome "proteome") initialize'
newTVarIO env
proteomeStage2 :: Proteome ()
proteomeStage2 = do
main <- Ribo.inspect Env.mainProject
readConfig "project" main
proteomeStage4 :: Proteome ()
proteomeStage4 = do
main <- Ribo.inspect Env.mainProject
readConfig "project_after" main