@@ -44,47 +44,48 @@ function cargo.get_config_root_dir(config, file_name)
4444 end
4545end
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