86 lines
2.4 KiB
Plaintext
86 lines
2.4 KiB
Plaintext
-- Copyright (C) 2025 ASTRONAND
|
|
local args=({...})[1]
|
|
local log=args.logging
|
|
local fs=args.filesystem
|
|
local loaded=args.preload or {}
|
|
local function dot_to_slash(name)
|
|
local parts = {}
|
|
local start = 1
|
|
for i = 1, #name do
|
|
if name:sub(i, i) == "." then
|
|
table.insert(parts, name:sub(start, i - 1))
|
|
start = i + 1
|
|
end
|
|
end
|
|
table.insert(parts, name:sub(start))
|
|
return table.concat(parts, "/")
|
|
end
|
|
|
|
local function replace_question_mark(path, name_path)
|
|
local result = {}
|
|
local replaced = false
|
|
for i = 1, #path do
|
|
local ch = path:sub(i, i)
|
|
if ch == "?" and not replaced then
|
|
table.insert(result, name_path)
|
|
replaced = true
|
|
else
|
|
table.insert(result, ch)
|
|
end
|
|
end
|
|
return table.concat(result)
|
|
end
|
|
|
|
local function search_module(name,search_paths)
|
|
local name_path = dot_to_slash(name)
|
|
|
|
for _, path in ipairs(search_paths) do
|
|
local filename = replace_question_mark(path, name_path)
|
|
if fs.exists(filename) and not fs.isDir(filename) then
|
|
local code=fs.open(filename,"x")
|
|
if code then
|
|
return code, filename
|
|
end
|
|
end
|
|
end
|
|
|
|
return nil, "module not found: " .. name
|
|
end
|
|
|
|
return {
|
|
makeRequire=function(search_paths)
|
|
local config=string.split(search_paths,";")
|
|
return {
|
|
require=function(query)
|
|
if loaded[query] then return table.deepcopy(loaded[query]) end
|
|
local code,file=search_module(query,config)
|
|
if code==nil then
|
|
error(file)
|
|
end
|
|
local ok,_,lib=pcall(pcall,code)
|
|
if ok then
|
|
log.log("Added: \""..query.."\" to require registry.")
|
|
loaded[query]=lib
|
|
return table.deepcopy(lib), file
|
|
else
|
|
log.warn("ERR in module "..file)
|
|
return nil, "ERR in module "..file.."."
|
|
end
|
|
end,
|
|
load=function(query, lib)
|
|
loaded[query]=lib
|
|
end
|
|
}
|
|
end,
|
|
list=function()
|
|
local list={}
|
|
for i,v in pairs(loaded) do
|
|
list[#list+1]={i=i,v=v}
|
|
end
|
|
local i=0
|
|
while i<#list do
|
|
i=i+1
|
|
return list[i].i, list[i].v
|
|
end
|
|
end
|
|
} |