Brenta Engine 1.2
Loading...
Searching...
No Matches
logger.cpp
1// SPDX-License-Identifier: MIT
2// Author: Giovanni Santini
3// Mail: giovanni.santini@proton.me
4// Github: @San7o
5
6#include <brenta/logger.hpp>
7
8using namespace brenta;
9
10//
11// Static variables
12//
13
14const std::string Logger::subsystem_name = "logger";
15Logger::Config Logger::init_config = {};
16bool Logger::initialized = false;
17
18//
19// Subsystem interface
20//
21
22std::string Logger::event_name(enum Event event)
23{
24 switch(event)
25 {
26 case Logger::Event::Lifetime: return "lifetime";
27 default: return "unknown";
28 }
29}
30
31std::expected<void, Subsystem::Error> Logger::initialize()
32{
33 if (this->is_initialized()) return {};
34
35 oak::set_level(Logger::init_config.log_level);
36
37 for (auto event : Logger::init_config.events)
38 oak::enable_event(event, Logger::event_name(event));
39
40 if (Logger::init_config.flags.size() == 0)
41 {
42 // Default
43 oak::set_flags(oak::Flags::Level);
44 }
45 else
46 {
47 oak::set_flags(oak::Flags::None);
48 for (auto& flag : Logger::init_config.flags)
49 oak::add_flags(flag);
50 }
51
52 auto file_name = Logger::init_config.log_file;
53 if (file_name != "")
54 {
55 oak::add_writer<oak::FileWriter>(file_name);
56 INFO("{}: set logging to file to {}", Logger::subsystem_name, file_name.string());
57 }
58
59 Logger::initialized = true;
60 INFO("{}: initialized", Logger::subsystem_name);
61 return {};
62}
63
64std::expected<void, Subsystem::Error> Logger::terminate()
65{
66 if (!this->is_initialized()) return {};
67
68 Logger::initialized = false;
69 return {};
70}
71
72std::string Logger::name()
73{
74 return Logger::subsystem_name;
75}
76
77bool Logger::is_initialized()
78{
79 return Logger::initialized;
80}
81
82//
83// Member functions
84//
85
86Logger &Logger::instance()
87{
88 static Logger _logger;
89 return _logger;
90}
91
92//
93// Builder
94//
95
96Logger::Builder &Logger::Builder::level(Logger::Level log_level)
97{
98 this->conf.log_level = log_level;
99 return *this;
100}
101
102Logger::Builder &Logger::Builder::file(std::filesystem::path log_file)
103{
104 this->conf.log_file = log_file;
105 return *this;
106}
107
108Logger::Builder &Logger::Builder::event(Logger::Event event)
109{
110 this->conf.events.push_back(event);
111 return *this;
112}
113
114Logger::Builder &Logger::Builder::flag(Logger::Flags flag)
115{
116 this->conf.flags.push_back(flag);
117 return *this;
118}
119
120Subsystem &Logger::Builder::build()
121{
122 Logger::init_config = this->conf;
123 return Logger::instance();
124}