forked from izaya/OC-PsychOS2
turns out this was already packaged. whoops.
This commit is contained in:
parent
904fdce527
commit
ae634bc52e
@ -1,200 +0,0 @@
|
|||||||
local component = require("component")
|
|
||||||
local computer = require("computer")
|
|
||||||
|
|
||||||
local proxylist = {}
|
|
||||||
local proxyobjs = {}
|
|
||||||
local typelist = {}
|
|
||||||
local doclist = {}
|
|
||||||
|
|
||||||
local oproxy = component.proxy
|
|
||||||
function component.proxy(address)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
if proxyobjs[address] ~= nil then
|
|
||||||
return proxyobjs[address]
|
|
||||||
end
|
|
||||||
return oproxy(address)
|
|
||||||
end
|
|
||||||
|
|
||||||
local olist = component.list
|
|
||||||
function component.list(filter, exact)
|
|
||||||
checkArg(1,filter,"string","nil")
|
|
||||||
local result = {}
|
|
||||||
local data = {}
|
|
||||||
for k,v in olist(filter, exact) do
|
|
||||||
data[#data + 1] = k
|
|
||||||
data[#data + 1] = v
|
|
||||||
result[k] = v
|
|
||||||
end
|
|
||||||
for k,v in pairs(typelist) do
|
|
||||||
if filter == nil or (exact and v == filter) or (not exact and v:find(filter, nil, true)) then
|
|
||||||
data[#data + 1] = k
|
|
||||||
data[#data + 1] = v
|
|
||||||
result[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local place = 1
|
|
||||||
return setmetatable(result,
|
|
||||||
{__call=function()
|
|
||||||
local addr,type = data[place], data[place + 1]
|
|
||||||
place = place + 2
|
|
||||||
return addr, type
|
|
||||||
end}
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
local otype = component.type
|
|
||||||
function component.type(address)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
if typelist[address] ~= nil then
|
|
||||||
return typelist[address]
|
|
||||||
end
|
|
||||||
return otype(address)
|
|
||||||
end
|
|
||||||
|
|
||||||
local odoc = component.doc
|
|
||||||
function component.doc(address, method)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
checkArg(2,method,"string")
|
|
||||||
if proxylist[address] ~= nil then
|
|
||||||
if proxylist[address][method] == nil then
|
|
||||||
error("no such method",2)
|
|
||||||
end
|
|
||||||
if doclist[address] ~= nil then
|
|
||||||
return doclist[address][method]
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
return odoc(address, method)
|
|
||||||
end
|
|
||||||
|
|
||||||
local oslot = component.slot
|
|
||||||
function component.slot(address)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
if proxylist[address] ~= nil then
|
|
||||||
return -1 -- vcomponents do not exist in a slot
|
|
||||||
end
|
|
||||||
return oslot(address)
|
|
||||||
end
|
|
||||||
|
|
||||||
local omethods = component.methods
|
|
||||||
function component.methods(address)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
if proxylist[address] ~= nil then
|
|
||||||
local methods = {}
|
|
||||||
for k,v in pairs(proxylist[address]) do
|
|
||||||
if type(v) == "function" then
|
|
||||||
methods[k] = true -- All vcomponent methods are direct
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return methods
|
|
||||||
end
|
|
||||||
return omethods(address)
|
|
||||||
end
|
|
||||||
|
|
||||||
local oinvoke = component.invoke
|
|
||||||
function component.invoke(address, method, ...)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
checkArg(2,method,"string")
|
|
||||||
if proxylist[address] ~= nil then
|
|
||||||
if proxylist[address][method] == nil then
|
|
||||||
error("no such method",2)
|
|
||||||
end
|
|
||||||
return proxylist[address][method](...)
|
|
||||||
end
|
|
||||||
return oinvoke(address, method, ...)
|
|
||||||
end
|
|
||||||
|
|
||||||
local ofields = component.fields
|
|
||||||
function component.fields(address)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
if proxylist[address] ~= nil then
|
|
||||||
return {} -- What even is this?
|
|
||||||
end
|
|
||||||
return ofields(address)
|
|
||||||
end
|
|
||||||
|
|
||||||
local componentCallback =
|
|
||||||
{
|
|
||||||
__call = function(self, ...) return proxylist[self.address][self.name](...) end,
|
|
||||||
__tostring = function(self) return (doclist[self.address] ~= nil and doclist[self.address][self.name] ~= nil) and doclist[self.address][self.name] or "function" end
|
|
||||||
}
|
|
||||||
|
|
||||||
local vcomponent = {}
|
|
||||||
|
|
||||||
function vcomponent.register(address, ctype, proxy, doc)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
checkArg(2,ctype,"string")
|
|
||||||
checkArg(3,proxy,"table")
|
|
||||||
if proxylist[address] ~= nil then
|
|
||||||
return nil, "component already at address"
|
|
||||||
elseif component.type(address) ~= nil then
|
|
||||||
return nil, "cannot register over real component"
|
|
||||||
end
|
|
||||||
proxy.address = address
|
|
||||||
proxy.type = ctype
|
|
||||||
local proxyobj = {}
|
|
||||||
for k,v in pairs(proxy) do
|
|
||||||
if type(v) == "function" then
|
|
||||||
proxyobj[k] = setmetatable({name=k,address=address},componentCallback)
|
|
||||||
else
|
|
||||||
proxyobj[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
proxylist[address] = proxy
|
|
||||||
proxyobjs[address] = proxyobj
|
|
||||||
typelist[address] = ctype
|
|
||||||
doclist[address] = doc
|
|
||||||
computer.pushSignal("component_added",address,ctype)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
function vcomponent.unregister(address)
|
|
||||||
checkArg(1,address,"string")
|
|
||||||
if proxylist[address] == nil then
|
|
||||||
if component.type(address) ~= nil then
|
|
||||||
return nil, "cannot unregister real component"
|
|
||||||
else
|
|
||||||
return nil, "no component at address"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local thetype = typelist[address]
|
|
||||||
proxylist[address] = nil
|
|
||||||
proxyobjs[address] = nil
|
|
||||||
typelist[address] = nil
|
|
||||||
doclist[address] = nil
|
|
||||||
computer.pushSignal("component_removed",address,thetype)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
function vcomponent.list()
|
|
||||||
local list = {}
|
|
||||||
for k,v in pairs(proxylist) do
|
|
||||||
list[#list + 1] = {k,typelist[k],v}
|
|
||||||
end
|
|
||||||
return list
|
|
||||||
end
|
|
||||||
|
|
||||||
function vcomponent.resolve(address, componentType)
|
|
||||||
checkArg(1, address, "string")
|
|
||||||
checkArg(2, componentType, "string", "nil")
|
|
||||||
for k,v in pairs(typelist) do
|
|
||||||
if componentType == nil or v == componentType then
|
|
||||||
if k:sub(1, #address) == address then
|
|
||||||
return k
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return nil, "no such component"
|
|
||||||
end
|
|
||||||
|
|
||||||
local r = math.random
|
|
||||||
function vcomponent.uuid()
|
|
||||||
return string.format("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
|
||||||
r(0,255),r(0,255),r(0,255),r(0,255),
|
|
||||||
r(0,255),r(0,255),
|
|
||||||
r(64,79),r(0,255),
|
|
||||||
r(128,191),r(0,255),
|
|
||||||
r(0,255),r(0,255),r(0,255),r(0,255),r(0,255),r(0,255))
|
|
||||||
end
|
|
||||||
|
|
||||||
return vcomponent
|
|
Loading…
Reference in New Issue
Block a user