all repos

gopher.nvim @ f599e75

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
127
128
129
130
---@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,

  -- restart gopls server after commands like `:GoMod`, `:GoGet`, `:GoWork`
  restart_lsp = false,

  -- 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("restart_lsp", _config.restart_lsp, "boolean")
  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