e
This commit is contained in:
86
disks/1h/sys/modules/require
Normal file
86
disks/1h/sys/modules/require
Normal file
@@ -0,0 +1,86 @@
|
||||
-- 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
|
||||
}
|
||||
Reference in New Issue
Block a user