63 lines
1.7 KiB
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
|