diff --git a/lua/gopher/_utils/commands.lua b/lua/gopher/_utils/commands.lua deleted file mode 100644 index 447a3af..0000000 --- a/lua/gopher/_utils/commands.lua +++ /dev/null @@ -1,43 +0,0 @@ -local Job = require "plenary.job" -local c = require("gopher.config").commands -local u = require "gopher._utils" - ----Run any go commands like `go generate`, `go get`, `go mod` ----@param cmd string ----@param ... string|string[] -return function(cmd, ...) - local args = { ... } - if #args == 0 then - u.deferred_notify("please provice any arguments", vim.log.levels.ERROR) - return - end - - if cmd == "generate" and #args == 1 and args[1] == "%" then - args[1] = vim.fn.expand "%" ---@diagnostic disable-line: missing-parameter - elseif cmd == "get" then - for i, arg in ipairs(args) do - ---@diagnostic disable-next-line: param-type-mismatch - local m = string.match(arg, "^https://(.*)$") or string.match(arg, "^http://(.*)$") or arg - table.remove(args, i) - table.insert(args, i, m) - end - end - - local cmd_args = vim.list_extend({ cmd }, args) ---@diagnostic disable-line: missing-parameter - Job:new({ - command = c.go, - args = cmd_args, - on_exit = function(_, retval) - if retval ~= 0 then - u.deferred_notify( - "command 'go " .. unpack(cmd_args) .. "' exited with code " .. retval, - vim.log.levels.ERROR - ) - u.deferred_notify(cmd .. " " .. unpack(cmd_args), vim.log.levels.DEBUG) - return - end - - u.deferred_notify("go " .. cmd .. " was success runned", vim.log.levels.INFO) - end, - }):start() -end diff --git a/lua/gopher/_utils/init.lua b/lua/gopher/_utils/init.lua index 4915ab3..136717d 100644 --- a/lua/gopher/_utils/init.lua +++ b/lua/gopher/_utils/init.lua @@ -1,5 +1,7 @@ local utils = {} +local TITLE = "gopher.nvim" + ---@param t table ---@return boolean function utils.is_tbl_empty(t) @@ -10,13 +12,24 @@ function utils.is_tbl_empty(t) end ---@param msg string ----@param lvl any +---@param lvl number function utils.deferred_notify(msg, lvl) vim.defer_fn(function() - vim.notify(msg, lvl) + vim.notify(msg, lvl, { + title = TITLE, + }) end, 0) end +---@param msg string +---@param lvl? number +function utils.notify(msg, lvl) + lvl = lvl or vim.log.levels.INFO + vim.notify(msg, lvl, { + title = TITLE, + }) +end + -- safe require ---@param module string module name function utils.sreq(module) diff --git a/lua/gopher/_utils/runner/gocmd.lua b/lua/gopher/_utils/runner/gocmd.lua new file mode 100644 index 0000000..97323f9 --- /dev/null +++ b/lua/gopher/_utils/runner/gocmd.lua @@ -0,0 +1,53 @@ +local r = require "gopher._utils.runner" +local c = require("gopher.config").commands +local u = require "gopher._utils" +local gocmd = {} + +---@param args string[] +---@return string[] +local function if_get(args) + for i, arg in ipairs(args) do + local m = string.match(arg, "^https://(.*)$") or string.match(arg, "^http://(.*)$") or arg + table.remove(args, i) + table.insert(args, i, m) + end + return args +end + +---@param args unknown[] +---@return string[] +local function if_generate(args) + if #args == 1 and args[1] == "%" then + args[1] = vim.fn.expand "%" + end + return args +end + +---@param subcmd string +---@param args string[] +---@return string[]|nil +function gocmd.run(subcmd, args) + if #args == 0 then + error "please provice any arguments" + end + + if subcmd == "get" then + args = if_get(args) + end + + if subcmd == "generate" then + args = if_generate(args) + end + + return r.sync(c.go, { + args = { subcmd, unpack(args) }, + on_exit = function(data, status) + if status ~= 0 then + error("gocmd failed: " .. data) + end + u.notify(c.go .. " " .. subcmd .. " successful runned") + end, + }) +end + +return gocmd diff --git a/lua/gopher/_utils/runner/init.lua b/lua/gopher/_utils/runner/init.lua new file mode 100644 index 0000000..3c08f7f --- /dev/null +++ b/lua/gopher/_utils/runner/init.lua @@ -0,0 +1,33 @@ +local Job = require "plenary.job" +local runner = {} + +---@class gopher.RunnerOpts +---@field args? string[] +---@field cwd? string? +---@field on_exit? fun(data:string, status:number) + +---@param cmd string +---@param opts gopher.RunnerOpts +---@return string[]|nil +function runner.sync(cmd, opts) + local output + Job:new({ + command = cmd, + args = opts.args, + cwd = opts.cwd, + on_stderr = function(_, data) + vim.print(data) + end, + on_exit = function(data, status) + output = data:result() + vim.schedule(function() + if opts.on_exit then + opts.on_exit(output, status) + end + end) + end, + }):sync(60000 --[[1 min]]) + return output +end + +return runner diff --git a/lua/gopher/gotests.lua b/lua/gopher/gotests.lua index cf9a0f1..942fab3 100644 --- a/lua/gopher/gotests.lua +++ b/lua/gopher/gotests.lua @@ -1,74 +1,45 @@ local c = require("gopher.config").commands -local u = require "gopher._utils" local ts_utils = require "gopher._utils.ts" -local Job = require "plenary.job" +local r = require "gopher._utils.runner" +local u = require "gopher._utils" local gotests = {} ----@param cmd_args table -local function run(cmd_args) - Job:new({ - command = c.gotests, - args = cmd_args, - on_exit = function(_, retval) - if retval ~= 0 then - u.deferred_notify( - "command '" .. c.gotests .. " " .. unpack(cmd_args) .. "' exited with code " .. retval, - vim.log.levels.ERROR - ) - return - end - - u.deferred_notify("unit test(s) generated", vim.log.levels.INFO) - end, - }):start() -end - ---@param args table local function add_test(args) - local fpath = vim.fn.expand "%" ---@diagnostic disable-line: missing-parameter table.insert(args, "-w") - table.insert(args, fpath) - run(args) + table.insert(args, vim.fn.expand "%") + + return r.sync(c.gotests, { + args = args, + on_exit = function(data, status) + if not status == 0 then + error("gotests failed: " .. data) + end + + u.notify "unit test(s) generated" + end, + }) end ---generate unit test for one function ----@param parallel boolean -function gotests.func_test(parallel) +function gotests.func_test() local ns = ts_utils.get_func_method_node_at_pos(unpack(vim.api.nvim_win_get_cursor(0))) if ns == nil or ns.name == nil then - u.deferred_notify("cursor on func/method and execute the command again", vim.log.levels.INFO) + u.notify("cursor on func/method and execute the command again", vim.log.levels.WARN) return end - local cmd_args = { "-only", ns.name } - if parallel then - table.insert(cmd_args, "-parallel") - end - - add_test(cmd_args) + add_test { "-only", ns.name } end ---generate unit tests for all functions in current file ----@param parallel boolean -function gotests.all_tests(parallel) - local cmd_args = { "-all" } - if parallel then - table.insert(cmd_args, "-parallel") - end - - add_test(cmd_args) +function gotests.all_tests() + add_test { "-all" } end ---generate unit tests for all exported functions ----@param parallel boolean -function gotests.all_exported_tests(parallel) - local cmd_args = {} - if parallel then - table.insert(cmd_args, "-parallel") - end - - table.insert(cmd_args, "-exported") - add_test(cmd_args) +function gotests.all_exported_tests() + add_test { "-exported" } end return gotests diff --git a/lua/gopher/iferr.lua b/lua/gopher/iferr.lua index fbeddf7..0898693 100644 --- a/lua/gopher/iferr.lua +++ b/lua/gopher/iferr.lua @@ -1,22 +1,16 @@ local c = require("gopher.config").commands -local u = require "gopher._utils" local iferr = {} -- That's Lua of vimscript implementation of: github.com/koron/iferr -iferr.iferr = function() +function iferr.iferr() local boff = vim.fn.wordcount().cursor_bytes - local cmd = (c.iferr .. " -pos " .. boff) - local data = vim.fn.systemlist(cmd, vim.fn.bufnr "%") + local pos = vim.fn.getcurpos()[2] + local data = vim.fn.systemlist((c.iferr .. " -pos " .. boff), vim.fn.bufnr "%") if vim.v.shell_error ~= 0 then - u.deferred_notify( - "command " .. cmd .. " exited with code " .. vim.v.shell_error, - vim.log.levels.ERROR - ) - return + error("iferr failed: " .. data) end - local pos = vim.fn.getcurpos()[2] vim.fn.append(pos, data) vim.cmd [[silent normal! j=2j]] vim.fn.setpos(".", pos) diff --git a/lua/gopher/impl.lua b/lua/gopher/impl.lua index 6eddc0f..155d6c2 100644 --- a/lua/gopher/impl.lua +++ b/lua/gopher/impl.lua @@ -1,5 +1,5 @@ local c = require("gopher.config").commands -local Job = require "plenary.job" +local r = require "gopher._utils.runner" local ts_utils = require "gopher._utils.ts" local u = require "gopher._utils" local impl = {} @@ -47,33 +47,23 @@ function impl.impl(...) recv = string.format("%s %s", recv_name, recv) end - -- stylua: ignore - local cmd_args = { - "-dir", vim.fn.fnameescape(vim.fn.expand "%:p:h"), ---@diagnostic disable-line: missing-parameter - recv, - iface - } - - local res_data - Job:new({ - command = c.impl, - args = cmd_args, - on_exit = function(data, retval) - if retval ~= 0 then - u.deferred_notify( - "command '" .. c.impl .. " " .. unpack(cmd_args) .. "' exited with code " .. retval, - vim.log.levels.ERROR - ) - return + local output = r.sync(c.impl, { + args = { + "-dir", + vim.fn.fnameescape(vim.fn.expand "%:p:h" --[[@as string]]), + recv, + iface, + }, + on_exit = function(data, status) + if not status == 0 then + error("impl failed: " .. data) end - - res_data = data:result() end, - }):sync() + }) local pos = vim.fn.getcurpos()[2] - table.insert(res_data, 1, "") - vim.fn.append(pos, res_data) + table.insert(output, 1, "") + vim.fn.append(pos, output) end return impl diff --git a/lua/gopher/init.lua b/lua/gopher/init.lua index 2f6f32e..06faf67 100644 --- a/lua/gopher/init.lua +++ b/lua/gopher/init.lua @@ -1,6 +1,6 @@ local tags = require "gopher.struct_tags" local tests = require "gopher.gotests" -local uc = require "gopher._utils.commands" +local gocmd = require("gopher._utils.runner.gocmd").run local gopher = {} gopher.setup = require("gopher.config").setup @@ -17,19 +17,19 @@ gopher.test_exported = tests.all_exported_tests gopher.tests_all = tests.all_tests gopher.get = function(...) - uc("get", ...) + gocmd("get", { ... }) end gopher.mod = function(...) - uc("mod", ...) + gocmd("mod", { ... }) end gopher.generate = function(...) - uc("generate", ...) + gocmd("generate", { ... }) end gopher.work = function(...) - uc("work", ...) + gocmd("work", { ... }) end return gopher diff --git a/lua/gopher/installer.lua b/lua/gopher/installer.lua index 939d50f..2994b8a 100644 --- a/lua/gopher/installer.lua +++ b/lua/gopher/installer.lua @@ -1,5 +1,5 @@ -local Job = require "plenary.job" local c = require("gopher.config").commands +local r = require "gopher._utils.runner" local u = require "gopher._utils" local installer = {} @@ -14,22 +14,16 @@ local urls = { ---@param pkg string local function install(pkg) local url = urls[pkg] .. "@latest" - - Job:new({ - command = c.go, + r.sync(c.go, { args = { "install", url }, - on_exit = function(_, retval) - if retval ~= 0 then - u.deferred_notify( - "command 'go install " .. url .. "' exited with code " .. retval, - vim.log.levels.ERROR - ) + on_exit = function(data, status) + if not status == 0 then + error("go install failed: " .. data) return end - - u.deferred_notify("install " .. url .. " finished", vim.log.levels.INFO) + u.notify("installed: " .. url) end, - }):start() + }) end ---Install required go deps diff --git a/lua/gopher/struct_tags.lua b/lua/gopher/struct_tags.lua index 690eae1..d31ce4b 100644 --- a/lua/gopher/struct_tags.lua +++ b/lua/gopher/struct_tags.lua @@ -1,7 +1,6 @@ local ts_utils = require "gopher._utils.ts" -local Job = require "plenary.job" +local r = require "gopher._utils.runner" local c = require("gopher.config").commands -local u = require "gopher._utils" local struct_tags = {} local function modify(...) @@ -39,45 +38,26 @@ local function modify(...) table.insert(cmd_args, "json") end - -- get result of "gomodifytags" works - local res_data - Job:new({ - command = c.gomodifytags, + local output = r.sync(c.gomodifytags, { args = cmd_args, - on_exit = function(data, retval) - if retval ~= 0 then - u.deferred_notify( - "command '" - .. c.gomodifytags - .. " " - .. unpack(cmd_args) - .. "' exited with code " - .. retval, - vim.log.levels.ERROR - ) - return + on_exit = function(data, status) + if not status == 0 then + error("gotag failed: " .. data) end - - res_data = data:result() end, - }):sync() + }) -- decode goted value - local tagged = vim.json.decode(table.concat(res_data)) + local tagged = vim.json.decode(table.concat(output)) if tagged.errors ~= nil or tagged.lines == nil or tagged["start"] == nil or tagged["start"] == 0 then - u.deferred_notify("failed to set tags " .. vim.inspect(tagged), vim.log.levels.ERROR) + error("failed to set tags " .. vim.inspec(tagged)) end - for i, v in ipairs(tagged.lines) do - tagged.lines[i] = u.rtrim(v) - end - - -- write goted tags vim.api.nvim_buf_set_lines( 0, tagged.start - 1, diff --git a/plugin/gopher.vim b/plugin/gopher.vim index bdffbbe..f54d5dd 100644 --- a/plugin/gopher.vim +++ b/plugin/gopher.vim @@ -1,8 +1,8 @@ command! -nargs=* GoTagAdd :lua require"gopher".tags_add() command! -nargs=* GoTagRm :lua require"gopher".tags_rm() -command! -nargs=* GoTestAdd :lua require"gopher".test_add() -command! -nargs=* GoTestsAll :lua require"gopher".tests_all() -command! -nargs=* GoTestsExp :lua require"gopher".test_exported() +command! GoTestAdd :lua require"gopher".test_add() +command! GoTestsAll :lua require"gopher".tests_all() +command! GoTestsExp :lua require"gopher".test_exported() command! -nargs=* GoMod :lua require"gopher".mod() command! -nargs=* GoGet :lua require"gopher".get() command! -nargs=* GoWork :lua require"gopher".work()