aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/platform.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/nvim-lsp-installer/platform.lua')
-rw-r--r--lua/nvim-lsp-installer/platform.lua102
1 files changed, 102 insertions, 0 deletions
diff --git a/lua/nvim-lsp-installer/platform.lua b/lua/nvim-lsp-installer/platform.lua
index 62c74046..7b54bc34 100644
--- a/lua/nvim-lsp-installer/platform.lua
+++ b/lua/nvim-lsp-installer/platform.lua
@@ -1,3 +1,6 @@
+local Data = require "nvim-lsp-installer.data"
+local Result = require "nvim-lsp-installer.core.result"
+local lazy = Data.lazy
local M = {}
local uname = vim.loop.os_uname()
@@ -40,4 +43,103 @@ M.path_sep = M.is_win and ";" or ":"
M.is_headless = #vim.api.nvim_list_uis() == 0
+---@generic T
+---@param platform_table table<Platform, T>
+---@return T
+local function get_by_platform(platform_table)
+ if M.is_mac then
+ return platform_table.mac or platform_table.unix
+ elseif M.is_linux then
+ return platform_table.linux or platform_table.unix
+ elseif M.is_unix then
+ return platform_table.unix
+ elseif M.is_win then
+ return platform_table.win
+ else
+ return nil
+ end
+end
+
+function M.when(cases)
+ local case = get_by_platform(cases)
+ if case then
+ return case()
+ else
+ error "Current platform is not supported."
+ end
+end
+
+---@type async fun(): table
+M.os_distribution = lazy(function()
+ ---Parses the provided contents of an /etc/\*-release file and identifies the Linux distribution.
+ ---@param contents string @The contents of a /etc/\*-release file.
+ ---@return table<string, any>
+ local function parse_linux_dist(contents)
+ local lines = vim.split(contents, "\n")
+
+ local entries = {}
+
+ for i = 1, #lines do
+ local line = lines[i]
+ local index = line:find "="
+ if index then
+ local key = line:sub(1, index - 1)
+ local value = line:sub(index + 1)
+ entries[key] = value
+ end
+ end
+
+ if entries.ID == "ubuntu" then
+ -- Parses the Ubuntu OS VERSION_ID into their version components, e.g. "18.04" -> {major=18, minor=04}
+ local version_id = entries.VERSION_ID:gsub([["]], "")
+ local version_parts = vim.split(version_id, "%.")
+ local major = tonumber(version_parts[1])
+ local minor = tonumber(version_parts[2])
+
+ return {
+ id = "ubuntu",
+ version_id = version_id,
+ version = { major = major, minor = minor },
+ }
+ else
+ return {
+ id = "linux-generic",
+ }
+ end
+ end
+
+ return M.when {
+ linux = function()
+ local spawn = require "nvim-lsp-installer.core.spawn"
+ return spawn.bash({ "-c", "cat /etc/*-release" })
+ :map_catching(function(result)
+ return parse_linux_dist(result.stdout)
+ end)
+ :recover(function()
+ return { id = "linux-generic" }
+ end)
+ :get_or_throw()
+ end,
+ mac = function()
+ return Result.success { id = "macOS" }
+ end,
+ win = function()
+ return Result.success { id = "windows" }
+ end,
+ }
+end)
+
+---@type async fun() Result @of String
+M.get_homebrew_prefix = lazy(function()
+ assert(M.is_mac, "Can only locate Homebrew installation on Mac systems.")
+ local spawn = require "nvim-lsp-installer.core.spawn"
+ return spawn.brew({ "--prefix" })
+ :map_catching(function(result)
+ return vim.trim(result.stdout)
+ end)
+ :map_err(function()
+ return "Failed to locate Homebrew installation."
+ end)
+end)
+
return M