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(),
uevent = require("hsv2.utils.uevent"):new(),
}
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.log:init(self._store)

View File

@ -4,8 +4,6 @@
---@class hsv2.enums: hsv2.object_t
local enums = {}
local const_tbl = require("hsv2.utils.const")
---@alias hsv2.uevent_t
---| "config-changed"
---| "key-doremap"
@ -13,10 +11,9 @@ local const_tbl = require("hsv2.utils.const")
---@field config_changed string triggered on configuration change
---@field key_remap string key mapping should be redone
enums.uevent = {
["config-changed"] = "HSV2ConfigChanged",
["key-doremap"] = "HSV2KeyRemap",
["config_changed"] = "HSV2ConfigChanged",
["key_doremap"] = "HSV2KeyRemap",
}
enums.uevents = const_tbl(enums.uevents)
---@alias hsv2.log_level_t
---| "all" alias for the highest log level
@ -47,6 +44,7 @@ enums.log_level = {
info = 6,
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:
-- hsv-2
---@module "hsv2.utils.log"
---@class hsv2.log: hsv2.with_store_t
---@class hsv2.log: hsv2.with_store_t, hsv2.object_t
local log = {}
local L = {}
@ -17,7 +17,7 @@ function log:init(store)
self._store = store
assert(type(self._store.config) == "table")
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),
})
end
@ -30,7 +30,7 @@ function log:write(msg, level)
local io = require("hsv2.utils.io")
level = level or "notice"
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)
end
end

View File

@ -1,18 +1,30 @@
-- vi: et sw=4 ts=4
-- hsv2
---@class hsv2.config: hsv2.with_store_t
---@class hsv2.config: hsv2.with_store_t, hsv2.object_t
local config = {}
---@class hsv2.config_t
config._config = {}
---@vararg string table key-path
function config:get(...)
local value = vim.tbl_get(self._config, ...)
return type(value) == "table" and require("hsv2.utils.const")(value)
local value = vim.tbl_get(self._config or {}, ...)
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
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
---@type hsv2.uevent_utils_t
local uev = self:store("uevent")

View File

@ -7,16 +7,23 @@ local object = {}
---@generic T: hsv2.object_t
---@generic U: table
---@param self T
---@param tbl? U
---@param t? U
---@return T|U
function object:new(tbl)
tbl = tbl or {}
setmetatable(tbl, self)
function object:new(t, append_only)
t = t or {}
setmetatable(t, self)
self.__index = self
self.__pairs = 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
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
---@field callback hsv2.aucmd.cbck_t
---@field desc? string
---@field group? integer|string
---@field group? string
---@field nested? 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
function uevent:add_callback(uev, opts)
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][uev] = self._callbacks[uev] or {}
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
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
local gid = vim.api.nvim_create_augroup(group, { clear = false })
return vim.api.nvim_get_autocmds({
event = "User",
callback = cb,
group = group,
pattern = L.valid_uev(self, uev),
event = "User",
group = gid,
pattern = L.valid_uev(self, uev),
})
end
---@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 group? string|integer
---|> "hsv2"
@ -88,11 +92,11 @@ end
---comment
---@generic uev_t: hsv2.uevent_t
---@param uevents uev_t|uev_t[]
---@return boolean|uev_t|uev_t[]
---@param uevents uev_t|list<integer, uev_t>
---@return boolean|uev_t|list<integer, uev_t>
function L.valid_uev(self, uevents)
---@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)
for _, valid_uev in ipairs(valid_uevents) do
if valid_uev:match(uev) then return true end