Still wip general

This commit is contained in:
Andrea Blankenstijn 2022-07-10 11:12:01 +02:00
parent da338e6104
commit cb81df46cc
7 changed files with 58 additions and 59 deletions

View File

@ -20,9 +20,12 @@ function hsv2:init(config)
log = require("hsv2.log"):new(), log = require("hsv2.log"):new(),
uevent = require("hsv2.utils.uevent"):new(), uevent = require("hsv2.utils.uevent"):new(),
} }
self._store.uevent:init(self._store) self._store.uevent:init(self._store)
self._store.uevent:add_callback({ ".*" }, {
callback = function (arg)
vim.pretty_print("event:", arg)
end
})
self._store.config:init(self._store) self._store.config:init(self._store)
self._store.log:init(self._store) self._store.log:init(self._store)

View File

@ -4,8 +4,6 @@
---@class hsv2.enums: hsv2.object_t ---@class hsv2.enums: hsv2.object_t
local enums = {} local enums = {}
local const_tbl = require("hsv2.utils.const")
---@alias hsv2.uevent_t ---@alias hsv2.uevent_t
---| "config-changed" ---| "config-changed"
---| "key-doremap" ---| "key-doremap"
@ -13,10 +11,9 @@ local const_tbl = require("hsv2.utils.const")
---@field config_changed string triggered on configuration change ---@field config_changed string triggered on configuration change
---@field key_remap string key mapping should be redone ---@field key_remap string key mapping should be redone
enums.uevent = { enums.uevent = {
["config-changed"] = "HSV2ConfigChanged", ["config_changed"] = "HSV2ConfigChanged",
["key-doremap"] = "HSV2KeyRemap", ["key_doremap"] = "HSV2KeyRemap",
} }
enums.uevents = const_tbl(enums.uevents)
---@alias hsv2.log_level_t ---@alias hsv2.log_level_t
---| "all" alias for the highest log level ---| "all" alias for the highest log level
@ -47,6 +44,7 @@ enums.log_level = {
info = 6, info = 6,
debug = 7, debug = 7,
} }
enums.log_level = const_tbl(enums.log_level)
return require("hsv2.prototypes.object"):new(const_tbl(enums)) require("hsv2.prototypes.object"):new(enums)
return enums

View File

@ -1,7 +1,7 @@
-- vi: et ts=4 sw=4: -- vi: et ts=4 sw=4:
-- hsv-2 -- hsv-2
---@module "hsv2.utils.log" ---@module "hsv2.utils.log"
---@class hsv2.log: hsv2.with_store_t ---@class hsv2.log: hsv2.with_store_t, hsv2.object_t
local log = {} local log = {}
local L = {} local L = {}
@ -17,7 +17,7 @@ function log:init(store)
self._store = store self._store = store
assert(type(self._store.config) == "table") assert(type(self._store.config) == "table")
self._store.config:set({ log = vim.deepcopy(self._config) }) self._store.config:set({ log = vim.deepcopy(self._config) })
self._store.uevent:add_callback(self._store.enums.uevents.config_changed, { self._store.uevent:add_callback("config_changed", {
callback = L.get_conf_change_cb(self), callback = L.get_conf_change_cb(self),
}) })
end end
@ -30,7 +30,7 @@ function log:write(msg, level)
local io = require("hsv2.utils.io") local io = require("hsv2.utils.io")
level = level or "notice" level = level or "notice"
if L.level_cmp(self, level, log._config.level) <= 0 then if L.level_cmp(self, level, log._config.level) <= 0 then
local msg_with_prefix = vim.list_extend(L.msg_prefix(level), msg) local msg_with_prefix = vim.list_extend(L.msg_prefix(self, level), msg)
io.echo(msg_with_prefix, true) io.echo(msg_with_prefix, true)
end end
end end

View File

@ -1,18 +1,30 @@
-- vi: et sw=4 ts=4 -- vi: et sw=4 ts=4
-- hsv2 -- hsv2
---@class hsv2.config: hsv2.with_store_t ---@class hsv2.config: hsv2.with_store_t, hsv2.object_t
local config = {} local config = {}
---@class hsv2.config_t
config._config = {} config._config = {}
---@vararg string table key-path
function config:get(...) function config:get(...)
local value = vim.tbl_get(self._config, ...) local value = vim.tbl_get(self._config or {}, ...)
return type(value) == "table" and require("hsv2.utils.const")(value) local function deep_map_const(value)
if type(value) == "table" then
value = vim.tbl_map(deep_map_const, value)
return require("hsv2.utils.const")(value)
end
return value
end
return type(value) == "table" and vim.tbl_map(deep_map_const, value)
or value or value
end end
function config:set(conf, dont_exec_aucmds) ---@
vim.tbl_deep_extend("force", self._config, conf) function config:set(newconf, dont_exec_aucmds)
vim.tbl_deep_extend("force", self._config or {}, newconf or {})
if not dont_exec_aucmds then if not dont_exec_aucmds then
---@type hsv2.uevent_utils_t ---@type hsv2.uevent_utils_t
local uev = self:store("uevent") local uev = self:store("uevent")

View File

@ -7,16 +7,23 @@ local object = {}
---@generic T: hsv2.object_t ---@generic T: hsv2.object_t
---@generic U: table ---@generic U: table
---@param self T ---@param self T
---@param tbl? U ---@param t? U
---@return T|U ---@return T|U
function object:new(tbl) function object:new(t, append_only)
tbl = tbl or {} t = t or {}
setmetatable(tbl, self) setmetatable(t, self)
self.__index = self self.__index = self
self.__pairs = self self.__pairs = self
self.__ipairs = self self.__ipairs = self
if append_only then
self.__newindex = function(_, k, v)
if t[k] == nil then t[k] = v
else error("tried to overwrite const t['" .. k .. "]", 2) end
return t[k]
end
end
return tbl return t
end end
return object return object

View File

@ -1,25 +0,0 @@
-- vi: ts=4 sw=4 et:
-- hsv2
---Set metatable to protect `t` keys from being overwritten
---@generic T: table
---@param t T
---@return T t
local function const_tbl(t)
return setmetatable({}, {
__index = t,
__newindex = function(proxy, k, v)
if t[k] == nil then t[k] = v
else error("tried to overwrite const t['" .. k .. "]", 2) end
return t[k]
end,
__ipairs = function()
assert(false, "Implement me!")
end,
__pairs = function()
assert(false, "Implement me!")
end,
})
end
return const_tbl

View File

@ -27,15 +27,15 @@ local default_augroup = "hsv2"
---@class hsv2.aucmd.opts_t ---@class hsv2.aucmd.opts_t
---@field callback hsv2.aucmd.cbck_t ---@field callback hsv2.aucmd.cbck_t
---@field desc? string ---@field desc? string
---@field group? integer|string ---@field group? string
---@field nested? boolean ---@field nested? boolean
---@field once? boolean ---@field once? boolean
-- --
---@param uev hsv2.uevent_t|hsv2.uevent_t[] ---@param uev hsv2.uevent_t|list<integer, hsv2.uevent_t>
---@param opts hsv2.aucmd.opts_t ---@param opts hsv2.aucmd.opts_t
function uevent:add_callback(uev, opts) function uevent:add_callback(uev, opts)
opts.group = opts.group and "hsv2-" .. opts.group or default_augroup opts.group = opts.group and "hsv2-" .. opts.group or default_augroup
if L.valid_uev(self, uev) and not next(self:get_callback(uev, opts.callback, opts.group)) then if L.valid_uev(self, uev) then
self._callbacks[opts.group] = self._callbacks[opts.group] or {} self._callbacks[opts.group] = self._callbacks[opts.group] or {}
self._callbacks[opts.group][uev] = self._callbacks[uev] or {} self._callbacks[opts.group][uev] = self._callbacks[uev] or {}
self._callbacks[opts.group][uev][opts.callback] = vim.api.nvim_create_autocmd("User", { self._callbacks[opts.group][uev][opts.callback] = vim.api.nvim_create_autocmd("User", {
@ -57,18 +57,22 @@ function uevent:del_callback(uev, cb, group)
end end
end end
function uevent:get_callback(uev, cb, group) ---
---@param uev hsv2.uevent_t
---@param cb hsv2.aucmd.cbck_t
---@param group string
function uevent:get_callbacks(uev, group)
group = group or default_augroup group = group or default_augroup
local gid = vim.api.nvim_create_augroup(group, { clear = false })
return vim.api.nvim_get_autocmds({ return vim.api.nvim_get_autocmds({
event = "User", event = "User",
callback = cb, group = gid,
group = group, pattern = L.valid_uev(self, uev),
pattern = L.valid_uev(self, uev),
}) })
end end
---@generic uev_t: hsv2.uevent_t ---@generic uev_t: hsv2.uevent_t
---@param uev uev_t|uev_t[] ---@param uev uev_t|list<integer, uev_t>
---@param buffer? integer buffer ID ---@param buffer? integer buffer ID
---@param group? string|integer ---@param group? string|integer
---|> "hsv2" ---|> "hsv2"
@ -88,11 +92,11 @@ end
---comment ---comment
---@generic uev_t: hsv2.uevent_t ---@generic uev_t: hsv2.uevent_t
---@param uevents uev_t|uev_t[] ---@param uevents uev_t|list<integer, uev_t>
---@return boolean|uev_t|uev_t[] ---@return boolean|uev_t|list<integer, uev_t>
function L.valid_uev(self, uevents) function L.valid_uev(self, uevents)
---@type string[] ---@type string[]
local valid_uevents = vim.tbl_keys(self:store("enums", "uevents")) local valid_uevents = vim.tbl_keys(self:store("enums", "uevent"))
local function valid(uev) local function valid(uev)
for _, valid_uev in ipairs(valid_uevents) do for _, valid_uev in ipairs(valid_uevents) do
if valid_uev:match(uev) then return true end if valid_uev:match(uev) then return true end