diff options
Diffstat (limited to 'lua/nvim-lsp-installer/platform.lua')
| -rw-r--r-- | lua/nvim-lsp-installer/platform.lua | 102 |
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 |
