local Meta = require "cave.meta" local Util = require "cave.util" local Context = require "cave.context" local ClassLogger = require "cave.log.class_logger" local validate = Meta.validate local Optional = Meta.Optional ---@class cave.Env ---@field vars table ---@field on_update_cbs function[] local Env = Meta.derive "Env" Env.log = ClassLogger.new(Env) ---@param context cave.Context? ---@return cave.Env function Env:new(context) local env = setmetatable({}, Env) env.vars = {} local dir, name, uuid if context then dir, name, uuid = tostring(context.dir), context.name, context.uuid else dir, name, uuid = nil, nil, nil end vim.fn.setenv("NVIM_PROJECT_DIR", dir) vim.fn.setenv("NVIM_PROJECT_NAME", name) vim.fn.setenv("NVIM_PROJECT_UUID", uuid) for _, entry in ipairs(vim.fn.systemlist { "nvim_env" }) do local split_idx = entry:find "=" assert(split_idx ~= nil) env.vars[entry:sub(1, split_idx - 1)] = entry:sub(split_idx + 1, -1) end return env end ---@param context cave.Context? function Env:update(context) validate { context = { context, Optional(Context) } } local log = Env.log:call("%s", context) local new_env = Env:new(context) local env_var_diff = Util.tbl_diff(self.vars, new_env.vars) for name, value in pairs(env_var_diff.added) do vim.fn.setenv(name, value) end for name, values in pairs(env_var_diff.modified) do vim.fn.setenv(name, values.new) end for name, _ in pairs(env_var_diff.removed) do vim.fn.setenv(name, nil) end self.vars = new_env.vars -- vim.g.python3_host_prog = get_python3_host_prog() log:ok("environment variables changed:\n%s", vim.inspect(env_var_diff)) end return Env