Skip to content

Commit 58be8a9

Browse files
Marc Jakobimrcjkb
authored andcommitted
refactor: extract get_cargo_metadata
1 parent 2788549 commit 58be8a9

File tree

1 file changed

+34
-33
lines changed

1 file changed

+34
-33
lines changed

lua/rustaceanvim/cargo.lua

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -44,47 +44,48 @@ function cargo.get_config_root_dir(config, file_name)
4444
end
4545
end
4646

47-
---The default implementation used for `vim.g.rustaceanvim.server.root_dir`
48-
---@param file_name string
49-
---@return string | nil root_dir
50-
function cargo.get_root_dir(file_name)
51-
local path = file_name:find('%.rs$') and vim.fs.dirname(file_name) or file_name
52-
if not path then
53-
return nil
54-
end
47+
---@param path string The directory to search upward from
48+
---@return string? cargo_crate_dir
49+
---@return table? cargo_metadata
50+
local function get_cargo_metadata(path)
5551
---@diagnostic disable-next-line: missing-fields
5652
local cargo_crate_dir = vim.fs.dirname(vim.fs.find({ 'Cargo.toml' }, {
5753
upward = true,
5854
path = path,
5955
})[1])
60-
---@type string | nil
61-
local cargo_workspace_dir = nil
62-
if vim.fn.executable('cargo') == 1 then
63-
local cmd = { 'cargo', 'metadata', '--no-deps', '--format-version', '1' }
64-
if cargo_crate_dir ~= nil then
65-
cmd[#cmd + 1] = '--manifest-path'
66-
cmd[#cmd + 1] = vim.fs.joinpath(cargo_crate_dir, 'Cargo.toml')
67-
end
68-
local cargo_metadata = ''
69-
local cm = vim.fn.jobstart(cmd, {
70-
on_stdout = function(_, d, _)
71-
cargo_metadata = table.concat(d, '\n')
72-
end,
73-
stdout_buffered = true,
56+
if vim.fn.executable('cargo') ~= 1 then
57+
return cargo_crate_dir
58+
end
59+
local cmd = { 'cargo', 'metadata', '--no-deps', '--format-version', '1' }
60+
if cargo_crate_dir ~= nil then
61+
cmd[#cmd + 1] = '--manifest-path'
62+
cmd[#cmd + 1] = vim.fs.joinpath(cargo_crate_dir, 'Cargo.toml')
63+
end
64+
local sc = vim
65+
.system(cmd, {
7466
cwd = vim.uv.fs_stat(path) and path or cargo_crate_dir or vim.fn.getcwd(),
7567
})
76-
if cm > 0 then
77-
cm = vim.fn.jobwait({ cm })[1]
78-
else
79-
cm = -1
80-
end
81-
if cm == 0 then
82-
local ok, cargo_metadata_json = pcall(vim.fn.json_decode, cargo_metadata)
83-
if ok and cargo_metadata_json then
84-
cargo_workspace_dir = cargo_metadata_json['workspace_root']
85-
end
86-
end
68+
:wait()
69+
if sc.code ~= 0 then
70+
return cargo_crate_dir
71+
end
72+
local ok, cargo_metadata_json = pcall(vim.fn.json_decode, sc.stdout)
73+
if ok and cargo_metadata_json then
74+
return cargo_crate_dir, cargo_metadata_json
75+
end
76+
return cargo_crate_dir
77+
end
78+
79+
---The default implementation used for `vim.g.rustaceanvim.server.root_dir`
80+
---@param file_name string
81+
---@return string | nil root_dir
82+
function cargo.get_root_dir(file_name)
83+
local path = file_name:find('%.rs$') and vim.fs.dirname(file_name) or file_name
84+
if not path then
85+
return nil
8786
end
87+
local cargo_crate_dir, cargo_metadata = get_cargo_metadata(path)
88+
local cargo_workspace_dir = cargo_metadata and vim.print(cargo_metadata['workspace_root'])
8889
return cargo_workspace_dir
8990
or cargo_crate_dir
9091
---@diagnostic disable-next-line: missing-fields

0 commit comments

Comments
 (0)