Search code examples
dmixins

D mixins with string switch statements


I have a D mixin that I'd like to use to generate a switch statement (case values, specifically) on string values, but despite KeyValues having entries in it and providing the right key values, the default case is always the only one executed:

class DataStore(KeyValues...) {
    void stringSetData(string key, string data) {
        switch(key) {
            foreach(D; KeyValues) {
                mixin("case \"" ~ D.Name ~ "\": set(to!(D.Type)(data)); break;");
            }
            default:
                throw new Exception("Invalid meta key"); break;
        }
    }
}

I've tested this with hard-coded values, and it works as expected, so my suspicion is that I might be doing something wrong with my mixin itself. How can I get this to work as expected?


Solution

  • The break inside the mixin is breaking from the foreach loop, not the switch. Replace it with return, or a labelled break.

    By the way, if you try to compile this code with warnings enabled, you get some weird error messages from DMD.