137 lines
2.3 KiB
Lua
137 lines
2.3 KiB
Lua
-- lua/lib/utils.lua
|
|
require("lua.lib.globals")
|
|
local M = {}
|
|
|
|
local function is_table(x)
|
|
return type(x) == "table"
|
|
end
|
|
|
|
local function is_list(t)
|
|
if type(t) ~= "table" then
|
|
return false
|
|
end
|
|
|
|
local n = 0
|
|
|
|
for k, _ in pairs(t) do
|
|
if type(k) ~= "number" then
|
|
return false
|
|
end
|
|
|
|
if k > n then
|
|
n = k
|
|
end
|
|
end
|
|
|
|
for i = 1, n do
|
|
if t[i] == nil then
|
|
return false
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
function M.list_extend(dst, src)
|
|
for _, value in ipairs(src) do
|
|
table.insert(dst, value)
|
|
end
|
|
|
|
return dst
|
|
end
|
|
|
|
local function deepcopy(value, seen)
|
|
if type(value) ~= "table" then
|
|
return value
|
|
end
|
|
|
|
seen = seen or {}
|
|
if seen[value] then
|
|
return seen[value]
|
|
end
|
|
|
|
local result = {}
|
|
seen[value] = result
|
|
|
|
for k, v in pairs(value) do
|
|
result[deepcopy(k, seen)] = deepcopy(v, seen)
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
function M.tbl_recursive_merge(defaults, overrides)
|
|
local result = deepcopy(defaults)
|
|
|
|
if not is_table(overrides) then
|
|
return result
|
|
end
|
|
|
|
for key, value in pairs(overrides) do
|
|
if is_table(value) and is_table(result[key]) then
|
|
result[key] = M.tbl_recursive_merge(result[key], value)
|
|
else
|
|
result[key] = deepcopy(value)
|
|
end
|
|
end
|
|
|
|
return result
|
|
end
|
|
|
|
function M.extend_config(defaults, user_module)
|
|
local file = HYPR .. "/" .. string.gsub(user_module, "%.", "/") .. ".lua"
|
|
if not M.is_file_exists(file) then
|
|
print(file .. " not found.")
|
|
return deepcopy(defaults)
|
|
end
|
|
local ok, overrides = pcall(require, user_module)
|
|
|
|
if not ok then
|
|
return deepcopy(defaults)
|
|
end
|
|
|
|
if type(overrides) ~= "table" then
|
|
return deepcopy(defaults)
|
|
end
|
|
|
|
return M.tbl_recursive_merge(defaults, overrides)
|
|
end
|
|
|
|
function M.is_file_exists(name)
|
|
local f = io.open(name, "r")
|
|
if f ~= nil then
|
|
io.close(f)
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function M.exec_if_file_extes(file)
|
|
if M.is_file_exists(file) then
|
|
hl.exec_cmd(file)
|
|
else
|
|
hl.notification.create({ file .. " doesn't extist", 5000, 0 })
|
|
end
|
|
end
|
|
|
|
function M.create_if_not_exists(path)
|
|
if not M.is_file_exists(path) then
|
|
os.execute('mkdir -pv "$(dirname "' .. path .. '")"')
|
|
os.execute("touch " .. path)
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function M.shell_quote(s)
|
|
return "'" .. tostring(s):gsub("'", "'\\''") .. "'"
|
|
end
|
|
|
|
function M.command_success(cmd)
|
|
local ok = os.execute(cmd)
|
|
return ok == true or ok == 0
|
|
end
|
|
|
|
return M
|