aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua')
-rw-r--r--lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua59
1 files changed, 59 insertions, 0 deletions
diff --git a/lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua b/lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua
new file mode 100644
index 00000000..19fe7448
--- /dev/null
+++ b/lua/nvim-lsp-installer/jobs/outdated-servers/cargo.lua
@@ -0,0 +1,59 @@
+local process = require "nvim-lsp-installer.process"
+local VersionCheckResult = require "nvim-lsp-installer.jobs.outdated-servers.version-check-result"
+local crates = require "nvim-lsp-installer.core.clients.crates"
+
+---@param output string The `cargo install --list` output.
+local function parse_installed_crates(output)
+ local installed_crates = {}
+ for _, line in ipairs(vim.split(output, "\n")) do
+ local name, version = line:match "^(.+)%s+v([.%S]+)[%s:]"
+ if name and version then
+ installed_crates[name] = version
+ end
+ end
+ return installed_crates
+end
+
+---@param server Server
+---@param source InstallReceiptSource
+---@param on_result fun(result: VersionCheckResult)
+local function cargo_check(server, source, on_result)
+ local stdio = process.in_memory_sink()
+ process.spawn("cargo", {
+ args = { "install", "--list", "--root", "." },
+ cwd = server.root_dir,
+ stdio_sink = stdio.sink,
+ }, function(success)
+ if not success then
+ return on_result(VersionCheckResult.fail(server))
+ end
+ local installed_crates = parse_installed_crates(table.concat(stdio.buffers.stdout, ""))
+ if not installed_crates[source.package] then
+ return on_result(VersionCheckResult.fail(server))
+ end
+ crates.fetch_crate(source.package, function(err, response)
+ if err then
+ return on_result(VersionCheckResult.fail(server))
+ end
+ if response.crate.max_stable_version ~= installed_crates[source.package] then
+ return on_result(VersionCheckResult.success(server, {
+ {
+ name = source.package,
+ current_version = installed_crates[source.package],
+ latest_version = response.crate.max_stable_version,
+ },
+ }))
+ else
+ return on_result(VersionCheckResult.empty(server))
+ end
+ end)
+ end)
+end
+
+return setmetatable({
+ parse_installed_crates = parse_installed_crates,
+}, {
+ __call = function(_, ...)
+ return cargo_check(...)
+ end,
+})