39 explicit UserDiagnostics(gsl::not_null<const TextFormatter *> format) : format_(format) {}
56 virtual void remark(
const std::string &tag,
const std::vector<std::string> &lines)
const = 0;
61 void remark(
const std::string &tag,
const std::string &msg)
const
63 remark(tag, std::vector{msg});
85 template <
typename FirstParam,
typename... RestParams>
87 !std::is_same_v<std::decay_t<FirstParam>, std::vector<FormatParam>> &&
88 std::is_constructible_v<FormatParam, FirstParam> &&
89 (std::is_constructible_v<FormatParam, RestParams> && ...))
90 void remark(
const std::string &tag,
const std::string &format_str, FirstParam &&first, RestParams &&...rest)
const
92 remark(tag,
formatter().format(format_str, std::forward<FirstParam>(first), std::forward<RestParams>(rest)...));
108 virtual void warning(
const std::string &tag,
const std::vector<std::string> &lines)
const = 0;
113 void warning(
const std::string &tag,
const std::string &msg)
const
115 warning(tag, std::vector{msg});
137 template <
typename FirstParam,
typename... RestParams>
139 !std::is_same_v<std::decay_t<FirstParam>, std::vector<FormatParam>> &&
140 std::is_constructible_v<FormatParam, FirstParam> &&
141 (std::is_constructible_v<FormatParam, RestParams> && ...))
142 void warning(
const std::string &tag,
const std::string &format_str, FirstParam &&first, RestParams &&...rest)
const
145 tag,
formatter().format(format_str, std::forward<FirstParam>(first), std::forward<RestParams>(rest)...));
162 virtual void error(
const std::string &tag,
const std::vector<std::string> &lines)
const = 0;
167 void error(
const std::string &tag,
const std::string &msg)
const
169 error(tag, std::vector{msg});
191 template <
typename FirstParam,
typename... RestParams>
193 !std::is_same_v<std::decay_t<FirstParam>, std::vector<FormatParam>> &&
194 std::is_constructible_v<FormatParam, FirstParam> &&
195 (std::is_constructible_v<FormatParam, RestParams> && ...))
196 void error(
const std::string &tag,
const std::string &format_str, FirstParam &&first, RestParams &&...rest)
const
198 error(tag,
formatter().format(format_str, std::forward<FirstParam>(first), std::forward<RestParams>(rest)...));
215 virtual void remark_note(
const std::string &tag,
const std::vector<std::string> &lines)
const = 0;
220 void remark_note(
const std::string &tag,
const std::string &msg)
const
244 template <
typename FirstParam,
typename... RestParams>
246 !std::is_same_v<std::decay_t<FirstParam>, std::vector<FormatParam>> &&
247 std::is_constructible_v<FormatParam, FirstParam> &&
248 (std::is_constructible_v<FormatParam, RestParams> && ...))
250 remark_note(
const std::string &tag,
const std::string &format_str, FirstParam &&first, RestParams &&...rest)
const
253 tag,
formatter().format(format_str, std::forward<FirstParam>(first), std::forward<RestParams>(rest)...));
270 virtual void warning_note(
const std::string &tag,
const std::vector<std::string> &lines)
const = 0;
275 void warning_note(
const std::string &tag,
const std::string &msg)
const
299 template <
typename FirstParam,
typename... RestParams>
301 !std::is_same_v<std::decay_t<FirstParam>, std::vector<FormatParam>> &&
302 std::is_constructible_v<FormatParam, FirstParam> &&
303 (std::is_constructible_v<FormatParam, RestParams> && ...))
305 warning_note(
const std::string &tag,
const std::string &format_str, FirstParam &&first, RestParams &&...rest)
const
308 tag,
formatter().format(format_str, std::forward<FirstParam>(first), std::forward<RestParams>(rest)...));
325 virtual void error_note(
const std::string &tag,
const std::vector<std::string> &lines)
const = 0;
330 void error_note(
const std::string &tag,
const std::string &msg)
const
354 template <
typename FirstParam,
typename... RestParams>
356 !std::is_same_v<std::decay_t<FirstParam>, std::vector<FormatParam>> &&
357 std::is_constructible_v<FormatParam, FirstParam> &&
358 (std::is_constructible_v<FormatParam, RestParams> && ...))
360 error_note(
const std::string &tag,
const std::string &format_str, FirstParam &&first, RestParams &&...rest)
const
363 tag,
formatter().format(format_str, std::forward<FirstParam>(first), std::forward<RestParams>(rest)...));
420 template <
typename T,
typename E>
424 const auto &chain = result.
chain();
429 auto filtered_view = chain | std::views::filter([](
const auto &err) {
430 const auto formattable_err =
dynamic_cast<const FormattableError *
>(err.get());
431 if (formattable_err ==
nullptr) {
437 std::vector<const Error *> filtered_chain;
438 for (
const auto &err : filtered_view) {
439 filtered_chain.push_back(err.get());
443 if (filtered_chain.empty()) {
444 panic(
"filtered error chain was empty, there should always be at least one FormattableError with details");
448 if (filtered_chain.size() > 1) {
450 const auto middle_range =
451 std::ranges::views::drop(filtered_chain, 1) | std::ranges::views::take(filtered_chain.size() - 2);
452 for (
const auto *err : middle_range) {
A result type that maintains a chainable sequence of errors for debugging and error reporting.
const std::vector< std::unique_ptr< Error > > & chain() const
Returns the complete error chain.
bool has_value() const
Checks whether the result contains a success value.
Abstract interface for all error types used in ChainableResult error chains.
Abstract base class for applying text styling with context-aware formatting.
Abstract class for structured error reporting and diagnostic output.
virtual void emit_fatal_proximate(const Error &err) const =0
Emit the proximate (immediate) error in a fatal error chain.
void warning(const std::string &tag, const std::string &format_str, FirstParam &&first, RestParams &&...rest) const
Variadic template overload for formatted warning messages.
void remark_note(const std::string &tag, const std::string &format_str, FirstParam &&first, RestParams &&...rest) const
Variadic template overload for formatted remark note messages.
virtual ~UserDiagnostics()=default
void error(const std::string &tag, const std::string &format_str, FirstParam &&first, RestParams &&...rest) const
Variadic template overload for formatted error messages.
virtual void warning_note(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged note message associated with a warning.
virtual void remark(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged remark message.
void error_note(const std::string &tag, const std::string &msg) const
Convenience overload for single line messages.
void error(const std::string &tag, const std::string &msg) const
Convenience overload for single line messages.
void fatal(const ChainableResult< T, E > &result) const
Display a fatal error with complete error chain visualization.
void error_note(const std::string &tag, const std::string &format_str, FirstParam &&first, RestParams &&...rest) const
Variadic template overload for formatted error note messages.
const TextFormatter & formatter() const
void warning_note(const std::string &tag, const std::string &format_str, FirstParam &&first, RestParams &&...rest) const
Variadic template overload for formatted warning note messages.
virtual void emit_fatal_step(const Error &err) const =0
Emit an intermediate step error in a fatal error chain.
void remark_note(const std::string &tag, const std::string &msg) const
Convenience overload for single line messages.
void remark(const std::string &tag, const std::string &format_str, FirstParam &&first, RestParams &&...rest) const
Variadic template overload for formatted remark messages.
virtual void warning(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged warning message.
virtual void error(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged error message.
UserDiagnostics(gsl::not_null< const TextFormatter * > format)
virtual void emit_fatal_root(const Error &err) const =0
Emit the root cause error in a fatal error chain.
virtual void remark_note(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged note message associated with a remark.
void remark(const std::string &tag, const std::string &msg) const
Convenience overload for single line messages.
void warning_note(const std::string &tag, const std::string &msg) const
Convenience overload for single line messages.
void warning(const std::string &tag, const std::string &msg) const
Convenience overload for single line messages.
virtual void error_note(const std::string &tag, const std::vector< std::string > &lines) const =0
Display a tagged note message associated with an error.
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
void assert_or_panic(bool condition, const StringViewSourceLoc &s)
Conditionally panics if the given condition is false.
@ warning
Emit a warning and continue decompilation.
@ error
Emit a formatted error and fail decompilation.