Files
cave.nvim/lua/cave/env.lua

63 lines
1.7 KiB
Lua

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<string, string>
---@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