all repos

gopher.nvim @ v0.4.0

Minimalistic plugin for Go development

gopher.nvim/lua/gopher/config.lua(view raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
---@type gopher.Config
---@dochide
---@diagnostic disable-next-line: missing-fields .setup() gets injected later
local config = {}

---@tag gopher.nvim-config.ConfigGoTagTransform
---@text Possible values for |gopher.Config|.gotag.transform:
---
---@dochide
---@alias gopher.ConfigGoTagTransform
---| "snakecase"  "GopherUser" -> "gopher_user"
---| "camelcase"  "GopherUser" -> "gopherUser"
---| "lispcase"   "GopherUser" -> "gopher-user"
---| "pascalcase" "GopherUser" -> "GopherUser"
---| "titlecase"  "GopherUser" -> "Gopher User"
---| "keep"       keeps the original field name

---@toc_entry Config
---@tag gopher.nvim-config
---@eval return MiniDoc.afterlines_to_code(MiniDoc.current.eval_section)
---@class gopher.Config
---@field setup fun(user_config?: gopher.Config)
local default_config = {
  -- log level, you might consider using DEBUG or TRACE for debugging the plugin
  ---@type number
  log_level = vim.log.levels.INFO,

  -- timeout for running internal commands
  ---@type number
  timeout = 2000,

  -- timeout for running installer commands(e.g :GoDepsInstall, :GoDepsInstallSync)
  ---@type number
  installer_timeout = 999999,

  -- user specified paths to binaries
  ---@class gopher.ConfigCommand
  commands = {
    go = "go",
    gomodifytags = "gomodifytags",
    gotests = "gotests",
    impl = "impl",
    iferr = "iferr",
  },
  ---@class gopher.ConfigGotests
  gotests = {
    -- a default template that gotess will use.
    -- gotets doesn't have template named `default`, we use it to represent absence of the provided template.
    template = "default",

    -- path to a directory containing custom test code templates
    ---@type string|nil
    template_dir = nil,

    -- use named tests(map with test name as key) in table tests(slice of structs by default)
    named = false,
  },
  ---@class gopher.ConfigGoTag
  gotag = {
    ---@type gopher.ConfigGoTagTransform
    transform = "snakecase",

    -- default tags to add to struct fields
    default_tag = "json",

    -- default tag option added struct fields, set to nil to disable
    -- e.g: `option = "json=omitempty,xml=omitempty`
    ---@type string|nil
    option = nil,
  },
  iferr = {
    -- choose a custom error message, nil to use default
    -- e.g: `message = 'fmt.Errorf("failed to %w", err)'`
    ---@type string|nil
    message = nil,
  },
}
--minidoc_afterlines_end

---@type gopher.Config
---@dochide
local _config = default_config

-- I am kinda secret so don't tell anyone about me even dont use me
--
-- if you don't believe me that i am secret see
-- the line below it says @private
---@private
_config.___plugin_name = "gopher.nvim" ---@diagnostic disable-line: inject-field

---@param user_config? gopher.Config
---@dochide
function config.setup(user_config)
  vim.validate("user_config", user_config, "table", true)

  _config = vim.tbl_deep_extend("force", vim.deepcopy(default_config), user_config or {})

  vim.validate("log_level", _config.log_level, "number")
  vim.validate("timeout", _config.timeout, "number")
  vim.validate("installer_timeout", _config.timeout, "number")
  vim.validate("commands", _config.commands, "table")
  vim.validate("commands.go", _config.commands.go, "string")
  vim.validate("commands.gomodifytags", _config.commands.gomodifytags, "string")
  vim.validate("commands.gotests", _config.commands.gotests, "string")
  vim.validate("commands.impl", _config.commands.impl, "string")
  vim.validate("commands.iferr", _config.commands.iferr, "string")
  vim.validate("gotests", _config.gotests, "table")
  vim.validate("gotests.template", _config.gotests.template, "string")
  vim.validate("gotests.template_dir", _config.gotests.template_dir, { "string", "nil" })
  vim.validate("gotests.named", _config.gotests.named, "boolean")
  vim.validate("gotag", _config.gotag, "table")
  vim.validate("gotag.transform", _config.gotag.transform, "string")
  vim.validate("gotag.default_tag", _config.gotag.default_tag, "string")
  vim.validate("gotag.option", _config.gotag.option, { "string", "nil" })
  vim.validate("iferr", _config.iferr, "table")
  vim.validate("iferr.message", _config.iferr.message, { "string", "nil" })
end

setmetatable(config, {
  __index = function(_, key)
    return _config[key]
  end,
})

---@dochide
return config