Fixed primaries being determined using the fuzzy component.list getter by adding a second parameter to list, exact, which will suppress fuzzy search.

This prevents the inventory controller upgrade to be returned for `component.inventory`, for example, and will only return it for `component.inventory_controller` now, as was originally intended.
This commit is contained in:
Florian Nücke 2014-06-20 22:10:43 +02:00
parent 64bf4d67e4
commit bc8c29812f
4 changed files with 11 additions and 7 deletions

View File

@ -17,7 +17,7 @@ setmetatable(component, { __index = function(_, key)
function component.get(address, componentType) function component.get(address, componentType)
checkArg(1, address, "string") checkArg(1, address, "string")
checkArg(2, componentType, "string", "nil") checkArg(2, componentType, "string", "nil")
for c in component.list(componentType) do for c in component.list(componentType, true) do
if c:sub(1, address:len()) == address then if c:sub(1, address:len()) == address then
return c return c
end end
@ -31,7 +31,7 @@ function component.isAvailable(componentType)
-- This is mostly to avoid out of memory errors preventing proxy -- This is mostly to avoid out of memory errors preventing proxy
-- creation cause confusion by trying to create the proxy again, -- creation cause confusion by trying to create the proxy again,
-- causing the oom error to be thrown again. -- causing the oom error to be thrown again.
component.setPrimary(componentType, component.list(componentType)()) component.setPrimary(componentType, component.list(componentType, true)())
end end
return primaries[componentType] ~= nil return primaries[componentType] ~= nil
end end
@ -108,7 +108,7 @@ local function onComponentRemoved(_, address, componentType)
if primaries[componentType] and primaries[componentType].address == address or if primaries[componentType] and primaries[componentType].address == address or
adding[componentType] and adding[componentType].address == address adding[componentType] and adding[componentType].address == address
then then
component.setPrimary(componentType, component.list(componentType)()) component.setPrimary(componentType, component.list(componentType, true)())
end end
end end

View File

@ -464,9 +464,9 @@ libcomponent = {
end end
error("no such method", 1) error("no such method", 1)
end, end,
list = function(filter) list = function(filter, exact)
checkArg(1, filter, "string", "nil") checkArg(1, filter, "string", "nil")
local list = spcall(component.list, filter) local list = spcall(component.list, filter, not not exact)
local key = nil local key = nil
return function() return function()
key = next(list, key) key = next(list, key)

View File

@ -12,9 +12,11 @@ class ComponentAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
lua.pushScalaFunction(lua => components.synchronized { lua.pushScalaFunction(lua => components.synchronized {
val filter = if (lua.isString(1)) Option(lua.toString(1)) else None val filter = if (lua.isString(1)) Option(lua.toString(1)) else None
val exact = if (lua.isBoolean(2)) lua.toBoolean(2) else true
lua.newTable(0, components.size) lua.newTable(0, components.size)
def matches(name: String) = if (exact) name == filter.get else name.contains(filter.get)
for ((address, name) <- components) { for ((address, name) <- components) {
if (filter.isEmpty || name.contains(filter.get)) { if (filter.isEmpty || matches(name)) {
lua.pushString(address) lua.pushString(address)
lua.pushString(name) lua.pushString(name)
lua.rawSet(-3) lua.rawSet(-3)

View File

@ -14,9 +14,11 @@ class ComponentAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
component.set("list", (args: Varargs) => components.synchronized { component.set("list", (args: Varargs) => components.synchronized {
val filter = if (args.isstring(1)) Option(args.tojstring(1)) else None val filter = if (args.isstring(1)) Option(args.tojstring(1)) else None
val exact = args.optboolean(2, false)
val table = LuaValue.tableOf(0, components.size) val table = LuaValue.tableOf(0, components.size)
def matches(name: String) = if (exact) name == filter.get else name.contains(filter.get)
for ((address, name) <- components) { for ((address, name) <- components) {
if (filter.isEmpty || name.contains(filter.get)) { if (filter.isEmpty || matches(name)) {
table.set(address, name) table.set(address, name)
} }
} }