Logger#

Examples/Logger#
#include <SevenBit/DI.hpp>
#include <filesystem>
#include <fstream>
#include <iostream>

using namespace sb::di;

struct ILogger
{
    virtual void log(const std::string &message) = 0;

    virtual ~ILogger() = default;
};

struct StdLogger final : ILogger
{
    void log(const std::string &message) override { std::cout << message << std::endl; }
};

struct FileLogger final : ILogger
{
    std::ofstream logFile{"log.txt"};

    void log(const std::string &message) override { logFile << message << std::endl; }
};

struct VoidLogger final : ILogger
{
    void log(const std::string &message) override {}
};

class Application
{
    ILogger &_logger;

  public:
    explicit Application(ILogger &logger) : _logger(logger) {}

    int run()
    {
        _logger.log("Initializing");
        init();
        _logger.log("Processing");
        process();
        _logger.log("Finalizing");
        finalize();
        return 0;
    }

  private:
    void init() {}
    void process() {}
    void finalize() {}
};

void addLogger(const std::string_view loggerName, ServiceCollection &services)
{
    if (loggerName == "fileLogger")
    {
        services.addSingleton<ILogger, FileLogger>();
    }
    else if (loggerName == "voidLogger")
    {
        services.addSingleton<ILogger, VoidLogger>();
    }
    else
    {
        services.addSingleton<ILogger, StdLogger>();
    }
}

int main(int argc, char *argv[])
{
    ServiceCollection services;
    const auto loggerName = argc > 1 ? argv[1] : "stdLogger";
    addLogger(loggerName, services);
    services.addSingleton<Application>();

    ServiceProvider provider = services.buildServiceProvider();

    auto &app = provider.getService<Application>();
    return app.run();
}