go.nvim/lua/go/health.lua
2024-02-09 20:34:35 +11:00

184 lines
4.3 KiB
Lua

local M = {}
local util = require('go.utils')
local log = util.log
local sep = util.sep()
local health = vim.health
if not vim.health then
health = require('health')
end
local tools = require('go.install').tools
local nvim_09 = vim.fn.has('nvim-0.9') == 1
local start = nvim_09 and health.start or health.report_start
local ok = nvim_09 and health.ok or health.report_ok
local error = nvim_09 and health.error or health.report_error
local warn = nvim_09 and health.warn or health.report_warn
local info = nvim_09 and health.info or health.report_info
local vfn = vim.fn
local function binary_check()
start('Binaries')
local no_err = true
local go_bin = 'go'
if vfn.executable(go_bin) == 1 then
info(go_bin .. ' installed.')
else
error(go_bin .. ' is not installed.')
no_err = false
end
for _, val in ipairs(tools) do
log(val)
if vfn.executable(val) == 1 then
info('Tool installed: ' .. val)
else
warn('Missing tool: ' .. val)
no_err = false
end
end
if vfn.executable('sed') == 1 then
info('sed installed.')
else
no_err = false
warn('sed is not installed. gotests may not fully work')
end
if vfn.executable('curl') == 1 then
info('curl installed.')
else
no_err = false
warn('curl is not installed, gocheat will not work.')
end
local parser_path = vim.api.nvim_get_runtime_file('parser' .. sep .. 'go.so', false)[1]
if not parser_path then
warn('go treesitter parser not found, please Run `:TSInstallSync go`')
no_err = false
end
if no_err then
ok('All binaries installed')
else
warn(
'Some binaries are not installed, please check if your $HOME/go/bin or $GOBIN $exists and in your $PATH'
)
end
end
local function plugin_check()
start('Go Plugin Check')
local plugins = {
'lspconfig',
'nvim-treesitter',
'guihua',
'nvim-dap-virtual-text',
'telescope',
}
local any_warn = false
local ts_installed = false
for _, plugin in ipairs(plugins) do
local pi = util.load_plugin(plugin)
if pi ~= nil then
ok(string.format('%s: plugin is installed', plugin))
if plugin == 'nvim-treesitter' then
ts_installed = true
end
else
any_warn = true
warn(string.format('%s: not installed/loaded', plugin))
end
end
if ts_installed then
local _info = require('nvim-treesitter.info').installed_parsers()
if vim.tbl_contains(_info, 'go') then
ok('nvim-treesitter-go is installed')
else
warn('nvim-treesitter-go is not installed, Please run TSInstall go to install')
any_warn = true
end
end
plugins = {
['nvim-dap'] = 'dap',
['nvim-dap-ui'] = 'dapui',
}
for name, req in pairs(plugins) do
local pi = util.load_plugin(name, req)
if pi ~= nil then
ok(string.format('%s: plugin is installed', name))
else
any_warn = true
warn(string.format('%s: not installed/loaded', name))
end
end
if any_warn then
warn('Not all plugin installed')
else
ok('All plugin installed')
end
end
-- check if GOBIN is in PATH
local function path_check(gobin)
local path = os.getenv('PATH')
if gobin == '' or vim.v.shell_error ~= 0 then
util.error('GOBIN is not set')
return false
end
gobin = gobin or 'notfound'
-- check GOBIN inside PATH
if not vim.tbl_contains(vim.split(path, ':', { trimempty = true }), gobin) then
return false
end
return true
end
local function goenv()
local env = {}
local raw = vim.fn.system('go env')
for key, value in string.gmatch(raw, '([^=]+)=[\'"]([^\'"]*)[\'"]\n') do
env[key] = #value > 0 and value or nil
end
return env
end
local function env_check()
local env = goenv()
local keys = { 'GOROOT', 'GOBIN' }
local any_warn = false
for _, key in ipairs(keys) do
if env[key] == nil then
info(string.format('%s is not set', key))
any_warn = true
else
ok(string.format('%s is set', key))
end
end
if any_warn then
info('Not all environment variables set')
else
ok('All environment variables set')
end
if not path_check(env['GOBIN']) then
warn('GOBIN is not in PATH')
else
ok('GOBIN is in PATH')
end
end
function M.check()
if vim.fn.has('nvim-0.9') == 0 then
warn('Suggested neovim version 0.9 or higher')
end
binary_check()
plugin_check()
env_check()
end
return M