diff options
Diffstat (limited to 'lua/mason-core/installer/InstallLocation.lua')
| -rw-r--r-- | lua/mason-core/installer/InstallLocation.lua | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/lua/mason-core/installer/InstallLocation.lua b/lua/mason-core/installer/InstallLocation.lua new file mode 100644 index 00000000..00b517b9 --- /dev/null +++ b/lua/mason-core/installer/InstallLocation.lua @@ -0,0 +1,98 @@ +local Path = require "mason-core.path" +local platform = require "mason-core.platform" +local settings = require "mason.settings" + +---@class InstallLocation +---@field private dir string +local InstallLocation = {} +InstallLocation.__index = InstallLocation + +---@param dir string +function InstallLocation:new(dir) + ---@type InstallLocation + local instance = {} + setmetatable(instance, self) + instance.dir = dir + return instance +end + +function InstallLocation.global() + return InstallLocation:new(settings.current.install_root_dir) +end + +function InstallLocation:get_dir() + return self.dir +end + +---@async +function InstallLocation:initialize() + local Result = require "mason-core.result" + local fs = require "mason-core.fs" + + return Result.try(function(try) + for _, p in ipairs { + self.dir, + self:bin(), + self:share(), + self:package(), + self:staging(), + } do + if not fs.async.dir_exists(p) then + try(Result.pcall(fs.async.mkdirp, p)) + end + end + end) +end + +---@param path string? +function InstallLocation:bin(path) + return Path.concat { self.dir, "bin", path } +end + +---@param path string? +function InstallLocation:share(path) + return Path.concat { self.dir, "share", path } +end + +---@param path string? +function InstallLocation:opt(path) + return Path.concat { self.dir, "opt", path } +end + +---@param pkg string? +function InstallLocation:package(pkg) + return Path.concat { self.dir, "packages", pkg } +end + +---@param path string? +function InstallLocation:staging(path) + return Path.concat { self.dir, "staging", path } +end + +---@param name string +function InstallLocation:lockfile(name) + return self:staging(("%s.lock"):format(name)) +end + +---@param path string +function InstallLocation:registry(path) + return Path.concat { self.dir, "registries", path } +end + +---@param pkg string +function InstallLocation:receipt(pkg) + return Path.concat { self:package(pkg), "mason-receipt.json" } +end + +---@param opts { PATH: '"append"' | '"prepend"' | '"skip"' } +function InstallLocation:set_env(opts) + vim.env.MASON = self.dir + + if opts.PATH == "prepend" then + vim.env.PATH = self:bin() .. platform.path_sep .. vim.env.PATH + elseif opts.PATH == "append" then + vim.env.PATH = vim.env.PATH .. platform.path_sep .. self:bin() + end +end + +return InstallLocation |
