aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/jobs/version-check/init.lua
blob: 3062bb78dc6f0f8d7084d6d18ab3e7a5ba9bbd71 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
local Result = require "nvim-lsp-installer.core.result"
local npm = require "nvim-lsp-installer.core.managers.npm"
local cargo = require "nvim-lsp-installer.core.managers.cargo"
local pip3 = require "nvim-lsp-installer.core.managers.pip3"
local gem = require "nvim-lsp-installer.core.managers.gem"
local go = require "nvim-lsp-installer.core.managers.go"
local luarocks = require "nvim-lsp-installer.core.managers.luarocks"
local git = require "nvim-lsp-installer.core.managers.git"
local composer = require "nvim-lsp-installer.core.managers.composer"

local M = {}

local ServerVersion = {}
ServerVersion.__index = ServerVersion

---@param field_name string
local function version_in_receipt(field_name)
    ---@param receipt InstallReceipt
    ---@return Result
    return function(_, receipt)
        return Result.success(receipt.primary_source[field_name])
    end
end

local function noop()
    return Result.failure "Unable to detect version."
end

---@type table<InstallReceiptSourceType, async fun(server: Server, receipt: InstallReceipt): Result>
local version_checker = {
    ["npm"] = function(server, receipt)
        return npm.get_installed_primary_package_version(receipt, server.root_dir)
    end,
    ["pip3"] = function(server, receipt)
        return pip3.get_installed_primary_package_version(receipt, server.root_dir)
    end,
    ["gem"] = function(server, receipt)
        return gem.get_installed_primary_package_version(receipt, server.root_dir)
    end,
    ["cargo"] = function(server, receipt)
        return cargo.get_installed_primary_package_version(receipt, server.root_dir)
    end,
    ["composer"] = function(server, receipt)
        return composer.get_installed_primary_package_version(receipt, server.root_dir)
    end,
    ["git"] = function(server)
        return git.get_installed_revision(server.root_dir)
    end,
    ["go"] = function(server, receipt)
        return go.get_installed_primary_package_version(receipt, server.root_dir)
    end,
    ["luarocks"] = function(server, receipt)
        return luarocks.get_installed_primary_package_version(receipt, server.root_dir)
    end,
    ["github_release_file"] = version_in_receipt "release",
    ["github_release"] = version_in_receipt "release",
    ["github_tag"] = version_in_receipt "tag",
    ["jdtls"] = version_in_receipt "version",
}

---@async
---@param server Server
---@return Result
function M.check_server_version(server)
    local receipt = server:get_receipt()
    if not receipt then
        return Result.failure "Unable to retrieve installation receipt."
    end
    local version_check = version_checker[receipt.primary_source.type] or noop
    local ok, result = pcall(version_check, server, receipt)
    if ok then
        return result
    else
        return Result.failure(result)
    end
end

return M