Repository navigation
Expand file tree
/
Copy patherror.cpp
More file actions
124 lines (102 loc) · 2.59 KB
/
Copy patherror.cpp
File metadata and controls
124 lines (102 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include "error.hpp"
#include <chrono>
#include <iomanip>
#include <sstream>
#include <utility>
namespace dynamic_file_binder {
namespace {
std::tm MakeLocalTime(std::time_t value)
{
std::tm result{};
#if defined(_WIN32)
localtime_s(&result, &value);
#else
localtime_r(&value, &result);
#endif
return result;
}
const char* ToString(ErrorSeverity severity)
{
switch (severity) {
case ErrorSeverity::Info:
return "INFO";
case ErrorSeverity::Warning:
return "WARN";
case ErrorSeverity::Recoverable:
return "RECOVERABLE";
case ErrorSeverity::Fatal:
return "FATAL";
}
return "UNKNOWN";
}
const char* ToString(ErrorDomain domain)
{
switch (domain) {
case ErrorDomain::FileBinder:
return "FileBinder";
case ErrorDomain::Database:
return "Database";
case ErrorDomain::Settings:
return "Settings";
case ErrorDomain::Governance:
return "Governance";
case ErrorDomain::ContextMenu:
return "ContextMenu";
case ErrorDomain::Daemon:
return "Daemon";
case ErrorDomain::System:
return "System";
}
return "Unknown";
}
} // namespace
ErrorManager& ErrorManager::Instance()
{
static ErrorManager instance;
return instance;
}
void ErrorManager::Report(ErrorRecord record)
{
record.timestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
std::lock_guard<std::mutex> lock(mutex_);
records_.push_back(std::move(record));
}
void ErrorManager::Clear()
{
std::lock_guard<std::mutex> lock(mutex_);
records_.clear();
}
bool ErrorManager::HasErrors() const
{
std::lock_guard<std::mutex> lock(mutex_);
return !records_.empty();
}
std::optional<ErrorRecord> ErrorManager::Last() const
{
std::lock_guard<std::mutex> lock(mutex_);
if (records_.empty()) {
return std::nullopt;
}
return records_.back();
}
std::vector<ErrorRecord> ErrorManager::Snapshot() const
{
std::lock_guard<std::mutex> lock(mutex_);
return records_;
}
std::string ErrorManager::Format(const ErrorRecord& record) const
{
const std::tm timeValue = MakeLocalTime(record.timestamp);
std::ostringstream stream;
stream << std::put_time(&timeValue, "%Y-%m-%d %H:%M:%S") << " [" << ToString(record.severity) << "] "
<< ToString(record.domain);
if (!record.code.empty()) {
stream << " (" << record.code << ")";
}
if (!record.path.empty()) {
stream << " @ " << record.path.string();
}
stream << ": " << record.message;
return stream.str();
}
} // namespace dynamic_file_binder