module des.flow.sysevdata;

/++ System event data

    passed to work element then before change thread state

    creation propertyes like `SysEvData.pause` and checking propertyes like
    `SysEvData.isPause` generates from mixin with `slist`
 +/
struct SysEvData
{
    /// store name of system event
    string msg;

    /// events names `[ "pause", "work", "stop" ]`
    enum slist = [ "pause", "work", "stop" ];

    mixin( getStateListString(slist) );

    private static string getStateListString( in string[] list ) pure
    {
        import std.string;
        string[] buf;

        foreach( state; list )
        {
            buf ~= format( `static @property SysEvData %1$s() { return SysEvData("%1$s"); }`, state );
            buf ~= format( `@property bool is%s() { return msg == "%s"; }`, state.capitalize, state );
        }

        return buf.join("\n");
    }
}

///
unittest
{
    auto ep = SysEvData.pause;
    assert( ep.isPause );
    auto ew = SysEvData.work;
    assert( ew.isWork );
}