Initial commit
This commit is contained in:
62
lua/cave/env.lua
Normal file
62
lua/cave/env.lua
Normal file
@@ -0,0 +1,62 @@
|
||||
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
|
||||
Reference in New Issue
Block a user