aboutsummaryrefslogtreecommitdiffstats
path: root/lua/mason-core/installer/location.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/mason-core/installer/location.lua')
-rw-r--r--lua/mason-core/installer/location.lua63
1 files changed, 63 insertions, 0 deletions
diff --git a/lua/mason-core/installer/location.lua b/lua/mason-core/installer/location.lua
new file mode 100644
index 00000000..2cc038e4
--- /dev/null
+++ b/lua/mason-core/installer/location.lua
@@ -0,0 +1,63 @@
+local Path = require "mason-core.path"
+local Result = require "mason-core.result"
+local fs = require "mason-core.fs"
+
+---@class InstallLocation
+---@field private dir string
+local InstallLocation = {}
+InstallLocation.__index = InstallLocation
+
+---@param dir string
+function InstallLocation.new(dir)
+ return setmetatable({
+ dir = dir,
+ }, InstallLocation)
+end
+
+function InstallLocation:get_dir()
+ return self.dir
+end
+
+---@async
+function InstallLocation:initialize()
+ 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:package(path)
+ return Path.concat { self.dir, "packages", path }
+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
+
+return InstallLocation