Build Packages / Unit tests (push) Skipped
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m34s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m0s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 10m23s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 10m23s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 11m16s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m49s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 8m32s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m15s
Build Packages / XDS test (durin plugin) (push) Successful in 7m16s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / build:rpm (rocky9) (push) Successful in 10m12s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 47s
Build Packages / DIALS test (push) Successful in 10m18s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 5m46s
Build Packages / build:rpm (rocky8) (push) Successful in 1h41m2s
Build Packages / XDS test (neggia plugin) (push) Successful in 1h59m18s
This is an UNSTABLE release. The release has significant modifications for data processing - in case of troubles go back to 1.0.0-rc.144. jfjoch_process: Generate a dedicated file (_process.h5), which can be used as a replacement for the _master.h5 file for a reanalyzed dataset. jfjoch_process: Improve the performance of scaling and merging, implement on the fly scaling. jfjoch_writer: All final data analysis results are repopulated in the _master.h5 file. jfjoch_scale: Dedicated tool for rescaling/merging existing data. jfjoch_viewer: Fix bugs where pixel labels where displayed on a wrong pixel. WARNING! Scaling and merging are experimental at the moment, and may not provide reasonable results for the time being. Reviewed-on: #56
72 lines
2.6 KiB
C++
72 lines
2.6 KiB
C++
// Copyright Global Phasing Ltd.
|
|
//
|
|
// Logger - a tiny utility for passing messages through a callback.
|
|
|
|
#ifndef GEMMI_LOGGER_HPP_
|
|
#define GEMMI_LOGGER_HPP_
|
|
|
|
#include <cstdio> // for fprintf
|
|
#include <functional> // for function
|
|
#include "fail.hpp" // for GEMMI_COLD
|
|
#include "util.hpp" // for cat
|
|
|
|
namespace gemmi {
|
|
|
|
/// Passes messages (including warnings/errors) to a callback function.
|
|
/// Messages are passed as strings without a trailing newline.
|
|
/// They have syslog-like severity levels: 8=debug, 6=info, 5=notice, 3=error,
|
|
/// allowing the use of a threshold to filter them.
|
|
/// Quirk: Errors double as both errors and warnings. Unrecoverable errors
|
|
/// don't go through this class; Logger only handles errors that can
|
|
/// be downgraded to warnings. If a callback is set, the error is passed
|
|
/// as a warning message. Otherwise, it's thrown as std::runtime_error.
|
|
struct Logger {
|
|
/// A function that handles messages.
|
|
std::function<void(const std::string&)> callback;
|
|
/// Pass messages of this level and all lower (more severe) levels:
|
|
/// 8=all, 6=all but debug, 5=notes and warnings, 3=warnings, 0=none
|
|
int threshold = 6;
|
|
|
|
/// suspend() and resume() are used internally to avoid duplicate messages
|
|
/// when the same function is called (internally) multiple times.
|
|
void suspend() { threshold -= 100; }
|
|
void resume() { threshold += 100; }
|
|
|
|
/// Send a message without any prefix on with a numeric threshold N.
|
|
template<int N, class... Args> void level(Args const&... args) const {
|
|
if (threshold >= N && callback)
|
|
callback(cat(args...));
|
|
}
|
|
|
|
/// Send a debug message.
|
|
template<class... Args> void debug(Args const&... args) const { level<8>("Debug: ", args...); }
|
|
/// Send a message without any prefix.
|
|
template<class... Args> void mesg(Args const&... args) const { level<6>(args...); }
|
|
/// Send a note (a notice, a significant message).
|
|
template<class... Args> void note(Args const&... args) const { level<5>("Note: ", args...); }
|
|
|
|
/// Send a warning/error (see Quirk above).
|
|
template<class... Args> GEMMI_COLD void err(Args const&... args) const {
|
|
if (threshold >= 3) {
|
|
std::string msg = cat(args...);
|
|
if (callback == nullptr)
|
|
fail(msg);
|
|
callback("Warning: " + msg);
|
|
}
|
|
}
|
|
|
|
// predefined callbacks
|
|
|
|
/// to be used as: logger.callback = Logger::to_stderr;
|
|
static void to_stderr(const std::string& s) {
|
|
std::fprintf(stderr, "%s\n", s.c_str());
|
|
}
|
|
/// to be used as: logger.callback = Logger::to_stdout;
|
|
static void to_stdout(const std::string& s) {
|
|
std::fprintf(stdout, "%s\n", s.c_str());
|
|
}
|
|
};
|
|
|
|
} // namespace gemmi
|
|
#endif
|