10 #include <QStringBuilder>
11 #include <QStringList>
21 CStatusMessageList::CStatusMessageList(
const CStatusMessage &statusMessage) { this->push_back(statusMessage); }
23 CStatusMessageList CStatusMessageList::findByCategory(
const CLogCategory &category)
const
25 return this->findBy([&](
const CStatusMessage &msg) {
return msg.getCategories().contains(category); });
30 return this->findBy(&CStatusMessage::getSeverity, severity);
33 bool CStatusMessageList::hasErrorMessages()
const
35 return this->contains(&CStatusMessage::getSeverity, CStatusMessage::SeverityError);
38 bool CStatusMessageList::hasWarningMessages()
const
40 return this->contains(&CStatusMessage::getSeverity, CStatusMessage::SeverityWarning);
43 bool CStatusMessageList::hasWarningOrErrorMessages()
const
45 return this->containsBy([=](
const CStatusMessage &m) {
46 return m.getSeverity() == CStatusMessage::SeverityWarning ||
47 m.getSeverity() == CStatusMessage::SeverityError;
51 bool CStatusMessageList::isSuccess()
const {
return !this->
isFailure(); }
53 bool CStatusMessageList::isFailure()
const {
return this->contains(&CStatusMessage::isFailure,
true); }
55 CStatusMessageList CStatusMessageList::getErrorMessages()
const {
return findBySeverity(SeverityError); }
57 CStatusMessageList CStatusMessageList::getWarningAndErrorMessages()
const
60 [&](
const CStatusMessage &msg) {
return msg.getSeverity() >= CStatusMessage::SeverityWarning; });
63 void CStatusMessageList::addCategory(
const CLogCategory &category)
65 for (
auto &msg : *
this) { msg.addCategory(category); }
68 void CStatusMessageList::addValidationCategory() { this->addCategory(CLogCategories::validation()); }
70 void CStatusMessageList::addCategories(
const CLogCategoryList &categories)
72 for (
auto &msg : *
this) { msg.addCategories(categories); }
75 void CStatusMessageList::addValidationMessage(
const QString &validationText,
78 static const CLogCategoryList cats({ CLogCategories::validation() });
79 const CStatusMessage msg(cats, severity, validationText);
83 void CStatusMessageList::setCategory(
const CLogCategory &category)
85 for (
auto &msg : *
this) { msg.setCategory(category); }
88 void CStatusMessageList::setCategories(
const CLogCategoryList &categories)
90 for (
auto &msg : *
this) { msg.setCategories(categories); }
95 for (
auto &msg : *
this) { msg.clampSeverity(severity); }
98 void CStatusMessageList::warningToError()
100 for (CStatusMessage &msg : *
this)
102 if (msg.getSeverity() != CStatusMessage::SeverityWarning) {
continue; }
103 msg.setSeverity(CStatusMessage::SeverityError);
107 void CStatusMessageList::sortBySeverity() { this->sortBy(&CStatusMessage::getSeverity); }
109 void CStatusMessageList::sortBySeverityHighestFirst()
111 this->sortBy(&CStatusMessage::getSeverity);
115 void CStatusMessageList::removeWarningsAndBelow()
117 if (this->isEmpty()) {
return; }
118 this->removeIf(&CStatusMessage::getSeverity, CStatusMessage::SeverityWarning);
119 this->removeInfoAndBelow();
124 if (this->isEmpty()) {
return; }
125 this->removeIf(&CStatusMessage::getSeverity, severity);
128 void CStatusMessageList::removeInfoAndBelow()
130 if (this->isEmpty()) {
return; }
131 this->removeIf(&CStatusMessage::getSeverity, CStatusMessage::SeverityDebug);
132 this->removeIf(&CStatusMessage::getSeverity, CStatusMessage::SeverityInfo);
135 int CStatusMessageList::keepLatest(
int estimtatedNumber)
137 const int oldSize = this->size();
138 if (estimtatedNumber >= oldSize) {
return 0; }
139 if (estimtatedNumber < 1)
145 CStatusMessageList copy(*
this);
146 copy.sortLatestFirst();
147 const QDateTime ts = copy[estimtatedNumber - 1].getUtcTimestamp();
149 copy.removeBefore(ts);
151 return oldSize - this->size();
157 for (
const CStatusMessage &msg : *
this)
160 if (ms == CStatusMessage::SeverityError) {
return CStatusMessage::SeverityError; }
161 if (ms <= s) {
continue; }
170 counts.insert(SeverityDebug, 0);
171 counts.insert(SeverityInfo, 0);
172 counts.insert(SeverityWarning, 0);
173 counts.insert(SeverityError, 0);
174 for (
const CStatusMessage &m : *
this) { counts[m.getSeverity()]++; }
178 CStatusMessage CStatusMessageList::toSingleMessage()
const
180 if (this->isEmpty()) {
return CStatusMessage(); }
181 if (this->size() == 1) {
return this->front(); }
184 CLogCategoryList cats;
185 for (
const CStatusMessage &msg : *
this)
187 if (msg.isEmpty()) {
continue; }
188 newMsgs.append(msg.getMessage());
190 if (s < ms) { s = ms; }
191 cats.push_back(msg.getCategories());
193 const CStatusMessage newMsg(cats, s, newMsgs.join(
", "));
197 QString CStatusMessageList::toHtml(
const CPropertyIndexList &indexes)
const
199 if (indexes.isEmpty() || this->isEmpty()) {
return {}; }
202 const bool withLineNumbers = indexes.contains(CPropertyIndexRef::GlobalIndexLineNumber);
203 CPropertyIndexList usedIndexes(indexes);
204 if (withLineNumbers) { usedIndexes.remove(CPropertyIndexRef::GlobalIndexLineNumber); }
205 for (
const CStatusMessage &statusMessage : *
this)
208 if (withLineNumbers) { rowHtml = u
"<td>" % QString::number(line++) % u
"</td>"; }
210 for (
const CPropertyIndex &index : usedIndexes)
213 statusMessage.propertyByIndex(index).toString().toHtmlEscaped().replace(
'\n',
"<br>") %
217 const QString severityClass = statusMessage.getSeverityAsString();
218 html += QStringLiteral(
"<tr class=\"%1\">%2</tr>").arg(severityClass, rowHtml);
220 return u
"<table>" % html % u
"</table>";
223 const CPropertyIndexList &CStatusMessageList::simpleHtmlOutput()
225 static const CPropertyIndexList properties(
226 { CPropertyIndexRef::GlobalIndexLineNumber, CStatusMessage::IndexMessage });
230 const CPropertyIndexList &CStatusMessageList::timestampHtmlOutput()
232 static const CPropertyIndexList properties(
233 { CStatusMessage::IndexUtcTimestampFormattedHms, CStatusMessage::IndexMessage });
237 QString htmlStyleSheetImpl()
239 const QString style =
240 u
'.' % CStatusMessage::severityToString(CStatusMessage::SeverityDebug) % u
" { color: lightgreen; } " %
241 u
'.' % CStatusMessage::severityToString(CStatusMessage::SeverityInfo) % u
" { color: lightgreen; } " % u
'.' %
242 CStatusMessage::severityToString(CStatusMessage::SeverityWarning) % u
" { color: yellow; } " % u
'.' %
243 CStatusMessage::severityToString(CStatusMessage::SeverityError) % u
" { color: red; }";
247 const QString &CStatusMessageList::htmlStyleSheet()
249 static const QString style(htmlStyleSheetImpl());
253 CStatusMessageList CStatusMessageList::fromDatabaseJson(
const QJsonArray &array)
255 CStatusMessageList messages;
256 for (
const QJsonValue &value : array)
258 messages.push_back(CStatusMessage::fromDatabaseJson(value.toObject()));
CStatusMessageList()=default
Constructor.
Free functions in swift::misc.
StatusSeverity
Status severities.
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
bool isFailure(HRESULT result)
Correctly casted values/checks.