Let's say I have a class or an interface with a function, and I want to pass that to a template to generate another function (in this case one that passes it to a scripting engine, and allows it to be called from there).
Currently I have the following issues:
- I have to pass the class/interface type to the template, and I cannot find anything about how to solve this issue.
- It also doesn't work at the moment, as it wants to call the member
Func
(name of the template argument) rather than the Function described as such. (There's also probably in std.functional I don't know about)
Code:
extern (C) public int registerDDelegate(alias Func, ClassType)(lua_State* state) nothrow
if(isSomeFunction!(Func)) {
import std.traits:Parameters, ReturnType;
Parameters!Func params;
int stackCounter = 0;
stackCounter--;
ClassType c = luaGetFromIndex!ClassType(state, stackCounter);
try {
foreach_reverse(ref param; params) {
stackCounter--;
param = luaGetFromIndex!(typeof(param))(state, stackCounter);
}
} catch (Exception e) {
luaL_error(state, "Argument type mismatch with D functions!");
}
try {
static if(is(ReturnType!Func == void)) {
c.Func(params);
return 0;
} else static if(is(ReturnType!Func == struct)) {
auto retVal = c.Func(params);
static foreach (key ; retVal.tupleof) {
LuaVar(key).pushToLuaState(state);
}
return cast(int)retVal.tupleof.length;
} else {
LuaVar(c.Func(params)).pushToLuaState(state);
return 1;
}
} catch (Exception e) {
//luaPushVar(L, null);
lastLuaToDException = e;
try {
luaL_error(state, ("A D function threw: "~e.toString~"!\0").ptr);
} catch(Exception e) {
luaL_error(state, "D threw when stringifying exception!");
}
return 1;
}
}