On Tuesday, 28 October 2014 at 12:02:16 UTC, Robert burner Schadek wrote:
It is a design goal to disable certain LogLevel at CT of a compile unit (CU).
e.g. make all logs to trace function template do nothing

One idea to make this working is to use prefixed version identifiers. Obviously this is all boilerplate so it could be done in a mixin template in std.log.

module mylib.log;

version (MyLibLogInfo)
    enum logLevel = LogLevel.info;
version (MyLibLogTrace)
    enum logLevel = LogLevel.trace;
version (MyLibLogWarning)
    enum logLevel = LogLevel.warning;
version (MyLibLogError)
    enum logLevel = LogLevel.error;

static if (is(typeof(logLevel)))
{
    // wrapper around Logger interface/class for CT logLevel
    static struct FixedLogLevel
    {
        enum logLevel = logLevel;
        Logger impl;
        alias impl this;
    }

    void setLogger(Logger logger)
    {
        logger.impl = logger;
    }

    private __gshared FixedLogLevel logger;
}

module mylib.foo;

void foo()
{
    import mylib.log;
    logger.info("bla");
    logger.error("wat");
}

module client.bar;

void bar()
{
    import mylib.log, mylib.foo;
    auto logger = new FileLogger("log.txt", LogLevel.warning);
    setLogger(logger);
    foo(); // CT check for LogLevel
    logger.info("runtime check whether info logging is on");
}

Reply via email to