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
|
-- The configuration for the static analyzer explcheck.
local toml = require("explcheck-toml")
local utils = require("explcheck-utils")
-- Read a TOML file with a user-defined configuration.
local function read_config_file(pathname)
local file = io.open(pathname, "r")
if file == nil then
return {}
end
local content = assert(file:read("*a"))
assert(file:close())
return toml.parse(content)
end
-- Load the default configuration from the pre-installed config file `explcheck-config.toml`.
local default_config_pathname = string.sub(debug.getinfo(1).source, 2, (#".lua" + 1) * -1) .. ".toml"
local default_config = read_config_file(default_config_pathname)
-- Load the user-defined configuration from the config file .explcheckrc (if it exists).
local user_config = read_config_file(".explcheckrc")
-- Get the value of an option.
local function get_option(key, options, pathname)
-- If a table of options is provided and the option is specified there, use it.
if options ~= nil and options[key] ~= nil then
return options[key]
end
-- Otherwise, try the user-defined configuration first, if it exists, and then the default configuration.
for _, config in ipairs({user_config, default_config}) do
if pathname ~= nil then
-- If a pathname is provided and the current configuration specifies the option for this filename, use it.
local filename = utils.get_basename(pathname)
if config["filename"] and config["filename"][filename] ~= nil and config["filename"][filename][key] ~= nil then
return config["filename"][filename][key]
end
-- If a pathname is provided and the current configuration specifies the option for this package, use it.
local package = utils.get_basename(utils.get_parent(pathname))
if config["package"] and config["package"][package] ~= nil and config["package"][package][key] ~= nil then
return config["package"][package][key]
end
end
-- If the current configuration specifies the option in the defaults, use it.
for _, section in ipairs({"defaults", "options"}) do -- TODO: Remove `[options]` in v1.0.0.
if config[section] ~= nil and config[section][key] ~= nil then
return config[section][key]
end
end
end
error('Failed to get a value for option "' .. key .. '"')
end
return get_option
|