Help me escape optional parens hell
Meta via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Sat Jun 24 00:53:28 PDT 2017
The code:
alias Response = Nullable!(string, "empty response (error)");
Response processMessage(string commandModule)(string message,
bool isCommand)
{
import std.meta;
import std.string;
import std.traits;
import command_uda;
mixin("import " ~ commandModule ~ ';');
bool foundCommandMatch = false;
foreach(symbol; getSymbolsByUDA!(mixin(commandModule),
Command))
{
enum commandUDA = getUDAs!(symbol, Command)[0];
auto commandPhrase = commandUDA.phrase == "" ?
symbol.stringof : commandUDA.phrase; //Error: function <function
signature> is not callable using argument types ()
auto commandPhrasePattern =
regex(`^%s\s`.format(commandPhrase));
if (message.matchFirst(commandPhrasePattern) &&
!foundCommandMatch)
{
version(responseDebug) writeln("Matched command ",
symbol.stringof, " with phrase '", commandPhrase, "'\n"); //Same
issue
return Response(symbol(message.strip()));
}
}
return Response.init;
}
I've been banging my head against this and cannot figure out why
`symbol.stringof` is being called instead of getting a string of
the symbol. I tried to create a reduced test case but it works
fine:
import std.stdio;
import std.traits;
enum Attr;
@Attr string test1() { return __FUNCTION__; }
@Attr string test2() { return __FUNCTION__; }
void process()
{
foreach (symbol; getSymbolsByUDA!(mixin(__MODULE__), Attr))
{
writeln("The result of calling ", symbol.stringof, " is ",
symbol());
}
}
void main()
{
process();
}
So I have no clue what I'm doing wrong. This is driving me insane.
More information about the Digitalmars-d-learn
mailing list