packages feed

proteome-0.9.9.9: lib/Proteome/Init.hs

module Proteome.Init where

import Exon (exon)
import qualified Log
import Ribosome (Handler, Rpc, RpcError, SettingError, Settings, resumeReport)
import Ribosome.Api (nvimCallFunction, uautocmd)
import qualified Ribosome.Settings as Settings

import Proteome.Config (logConfig, readConfig)
import Proteome.Data.Env (Env)
import qualified Proteome.Data.Env as Env (mainProject)
import Proteome.Data.Project (Project (Project))
import Proteome.Data.ProjectMetadata (ProjectMetadata (DirProject, VirtualProject))
import Proteome.Data.ProjectRoot (ProjectRoot (ProjectRoot))
import Proteome.Data.ProjectType (ProjectType (ProjectType))
import Proteome.Data.ResolveError (ResolveError)
import Proteome.Project.Activate (activateProject)
import Proteome.Project.Resolve (fromRootSettings)
import qualified Proteome.Settings as Settings (mainName, mainProjectDir, mainType)

resolveMainProject ::
  Members [Settings, Settings !! SettingError, Rpc, Stop ResolveError, Embed IO] r =>
  Sem r Project
resolveMainProject = do
  mainDir <- Settings.maybe Settings.mainProjectDir
  vimCwd <- nvimCallFunction "getcwd" []
  fromRootSettings (ProjectRoot (fromMaybe vimCwd mainDir))

updateMainType ::
  Member Settings r =>
  Maybe ProjectType ->
  Sem r ()
updateMainType tpe =
  Settings.update Settings.mainType (fromMaybe (ProjectType "none") tpe)

setMainProjectVars ::
  Member Settings r =>
  ProjectMetadata ->
  Sem r ()
setMainProjectVars = \case
  DirProject name _ tpe -> do
    Settings.update Settings.mainName name
    updateMainType tpe
  VirtualProject name -> do
    Settings.update Settings.mainName name
    updateMainType (Just (ProjectType "virtual"))

initWithMain ::
  Members [AtomicState Env, Settings, Rpc, Log, Embed IO] r =>
  Project ->
  Sem r ()
initWithMain main@(Project meta _ _ _) = do
  Log.debug [exon|initializing with main project: #{show main}|]
  atomicModify' (#mainProject .~ main)
  setMainProjectVars meta
  activateProject main

resolveAndInitMain ::
  Members [AtomicState Env, Settings !! SettingError, Settings, Rpc, Stop ResolveError, Log, Embed IO] r =>
  Sem r ()
resolveAndInitMain =
  initWithMain =<< resolveMainProject

loadConfig ::
  Members [AtomicState Env, Rpc] r =>
  Text ->
  Sem r ()
loadConfig dir =
  logConfig =<< readConfig dir =<< atomicGets Env.mainProject

projectConfig ::
  Members [AtomicState Env, Rpc] r =>
  Sem r ()
projectConfig = do
  loadConfig "project"
  uautocmd "ProteomeProject"

projectConfigAfter ::
  Members [AtomicState Env, Rpc] r =>
  Sem r ()
projectConfigAfter = do
  loadConfig "project_after"
  uautocmd "ProteomeProjectAfter"
  uautocmd "RibosomeUpdateVariables"

proLoad ::
  Members [AtomicState Env, Rpc !! RpcError] r =>
  Handler r ()
proLoad =
  resumeReport @Rpc projectConfig

proLoadAfter ::
  Members [AtomicState Env, Rpc !! RpcError] r =>
  Handler r ()
proLoadAfter =
  resumeReport @Rpc projectConfigAfter