tl;dr: is it possible to iterate over all classes in a program at compile time (or possibly all derived classes from a given base class) to use in a mixin?
Longer version:
Hi! I'm essentially trying to select which class to instantiate/use as template argument based on a runtime string (user provided). Something like:
string s = args[1];
if (s == "foo") { import foo; return Driver!Foo.run(); }
if (s == "bar") { import bar; return Driver!Bar.run(); }
if (s == "baz") { import baz; return Driver!Baz.run(); }
...
Using mixins, I managed to reduce this to:
static foreach(name; ["Foo", "Bar", "Baz"])
{
mixin(iq{
if (s == "$(name.toLower)")
{
import $(name.toLower);
return Driver!$(name).run();
}
}.text);
}
But it would be even nicer not to have to list the classes by hand, of course (there might be hundreds eventually).
The closest I got so far is to generate the list of names with a pre-build command that greps through the sources for relevant class names, and a file import:
const names = import("names.csv").split(",");
But that feels like cheating, and it's of course error-prone since it's text based. Also, if I'm going to run a pre-build command, I might as well just generate the boilerplate source code there and just compile the file directly.
Would there a cleaner, D-like way to achieve this? Or a completely different approach to the problem?