blob: d75fe499e37dfa1d1abbf2564cdaf53fcdf42e75 [file] [log] [blame] [raw]
package li.cil.oc.integration.computercraft;
import dan200.computercraft.api.lua.ILuaObject;
import li.cil.oc.api.driver.Converter;
import li.cil.oc.api.machine.Arguments;
import li.cil.oc.api.machine.Context;
import li.cil.oc.api.network.ManagedPeripheral;
import li.cil.oc.api.prefab.AbstractValue;
import java.util.Map;
public final class ConverterLuaObject implements Converter {
@Override
public void convert(final Object value, final Map<Object, Object> output) {
if (value instanceof ILuaObject) {
output.put("value", new LuaObjectValue((ILuaObject) value));
}
}
public static final class LuaObjectValue extends AbstractValue implements ManagedPeripheral {
private final ILuaObject value;
protected final CallableHelper helper;
// For loading when values were saved in a computer state.
public LuaObjectValue() {
value = null;
helper = null;
}
public LuaObjectValue(final ILuaObject value) {
this.value = value;
helper = new CallableHelper(value.getMethodNames());
}
@Override
public String[] methods() {
if (value != null)
return value.getMethodNames();
return new String[0]; // Loaded userdata, missing context.
}
@Override
public Object[] invoke(final String method, final Context context, final Arguments args) throws Exception {
if (value != null) {
final int index = helper.methodIndex(method);
final Object[] argArray = helper.convertArguments(args);
return value.callMethod(DriverPeripheral.Environment.UnsupportedLuaContext.instance(), index, argArray);
}
return new Object[]{null, "ComputerCraft userdata cannot be persisted"};
}
}
}