Files
aceVM/disks/1h/sys/modules/require
2025-09-29 00:03:57 -04:00

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
}