Porytiles
Loading...
Searching...
No Matches
stderr_styled_user_diagnostics.cpp
Go to the documentation of this file.
2
3#include <iostream>
4#include <ranges>
5#include <string>
6#include <vector>
7
10
11namespace porytiles {
12
13void StderrStyledUserDiagnostics::remark(const std::string &tag, const std::vector<std::string> &lines) const
14{
15 assert_or_panic(!lines.empty(), "lines vector is empty");
16 assert_or_panic(!tag.empty(), "tag is empty");
17
18 std::cerr << formatter().style("remark ", Style::bold | Style::blue)
20 << formatter().style("]:", Style::bold | Style::blue) << std::endl;
21 std::cerr << formatter().style("│", Style::bold | Style::blue) << std::endl;
22 for (const auto &line : lines) {
23 std::cerr << formatter().style("│", Style::bold | Style::blue) << " " << line << std::endl;
24 }
25 std::cerr << formatter().style("│", Style::bold | Style::blue) << std::endl;
26}
27
28void StderrStyledUserDiagnostics::warning(const std::string &tag, const std::vector<std::string> &lines) const
29{
30 assert_or_panic(!lines.empty(), "lines vector is empty");
31 assert_or_panic(!tag.empty(), "tag is empty");
32
33 std::cerr << formatter().style("warning ", Style::bold | Style::magenta)
36 << formatter().style("]:", Style::bold | Style::magenta) << std::endl;
37 std::cerr << formatter().style("│", Style::bold | Style::magenta) << std::endl;
38 for (const auto &line : lines) {
39 std::cerr << formatter().style("│", Style::bold | Style::magenta) << " " << line << std::endl;
40 }
41 std::cerr << formatter().style("│", Style::bold | Style::magenta) << std::endl;
42}
43
44void StderrStyledUserDiagnostics::error(const std::string &tag, const std::vector<std::string> &lines) const
45{
46 assert_or_panic(!lines.empty(), "lines vector is empty");
47 assert_or_panic(!tag.empty(), "tag is empty");
48
49 std::cerr << formatter().style("error ", Style::bold | Style::red)
51 << formatter().style("]:", Style::bold | Style::red) << std::endl;
52 std::cerr << formatter().style("│", Style::bold | Style::red) << std::endl;
53 for (const auto &line : lines) {
54 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << line << std::endl;
55 }
56 std::cerr << formatter().style("│", Style::bold | Style::red) << std::endl;
57}
58
60{
61 auto lines = err.details(formatter());
62 if (!lines.empty()) {
63 std::cerr << formatter().style("fatal:", Style::bold | Style::red) << std::endl;
64 std::cerr << formatter().style("│", Style::bold | Style::red) << std::endl;
65 for (const auto &line : lines) {
66 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << line << std::endl;
67 }
68 std::cerr << formatter().style("│", Style::bold | Style::red) << std::endl;
69 }
70}
71
73{
74 std::cerr << formatter().style("├ caused by:", Style::bold | Style::red) << std::endl;
75 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << std::endl;
76
77 auto lines = err.details(formatter());
78 if (!lines.empty()) {
79 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << lines.at(0) << std::endl;
80 for (const auto &line : std::ranges::views::drop(lines, 1)) {
81 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << line << std::endl;
82 }
83 }
84 std::cerr << formatter().style("│", Style::bold | Style::red) << std::endl;
85}
86
88{
89 std::cerr << formatter().style("├ root cause:", Style::bold | Style::red) << std::endl;
90 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << std::endl;
91
92 auto lines = err.details(formatter());
93 if (!lines.empty()) {
94 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << lines.at(0) << std::endl;
95 for (const auto &line : std::ranges::views::drop(lines, 1)) {
96 std::cerr << formatter().style("│", Style::bold | Style::red) << " " << line << std::endl;
97 }
98 }
99 std::cerr << formatter().style("│", Style::bold | Style::red) << std::endl;
100}
101
102void StderrStyledUserDiagnostics::remark_note(const std::string &tag, const std::vector<std::string> &lines) const
103{
104 emit_note_impl(tag, lines);
105}
106
107void StderrStyledUserDiagnostics::warning_note(const std::string &tag, const std::vector<std::string> &lines) const
108{
109 emit_note_impl(tag, lines);
110}
111
112void StderrStyledUserDiagnostics::error_note(const std::string &tag, const std::vector<std::string> &lines) const
113{
114 emit_note_impl(tag, lines);
115}
116
117void StderrStyledUserDiagnostics::emit_note_impl(const std::string &tag, const std::vector<std::string> &lines) const
118{
119 assert_or_panic(!lines.empty(), "lines vector is empty");
120 assert_or_panic(!tag.empty(), "tag is empty");
121
122 std::cerr << formatter().style("note ", Style::bold | Style::cyan)
124 << formatter().style("]:", Style::bold | Style::cyan) << std::endl;
125 std::cerr << formatter().style("│", Style::bold | Style::cyan) << std::endl;
126 for (const auto &line : lines) {
127 std::cerr << formatter().style("│", Style::bold | Style::cyan) << " " << line << std::endl;
128 }
129 std::cerr << formatter().style("│", Style::bold | Style::cyan) << std::endl;
130}
131
132} // namespace porytiles
Abstract interface for all error types used in ChainableResult error chains.
Definition error.hpp:19
virtual std::vector< std::string > details(const TextFormatter &formatter) const =0
Returns a formatted multi-line string representation of the error.
void error(const std::string &tag, const std::vector< std::string > &lines) const override
Display a multi-line tagged error message to stderr.
void warning_note(const std::string &tag, const std::vector< std::string > &lines) const override
Display a multi-line tagged note associated with a warning to stderr.
void emit_fatal_proximate(const Error &err) const override
Emit the proximate (immediate) error in a fatal error chain to stderr.
void remark(const std::string &tag, const std::vector< std::string > &lines) const override
Display a multi-line tagged informational remark to stderr.
void remark_note(const std::string &tag, const std::vector< std::string > &lines) const override
Display a multi-line tagged note associated with a remark to stderr.
void emit_fatal_root(const Error &err) const override
Emit the root cause error in a fatal error chain to stderr.
void emit_fatal_step(const Error &err) const override
Emit an intermediate step error in a fatal error chain to stderr.
void warning(const std::string &tag, const std::vector< std::string > &lines) const override
Display a multi-line tagged warning to stderr.
void error_note(const std::string &tag, const std::vector< std::string > &lines) const override
Display a multi-line tagged note associated with an error to stderr.
static const Style magenta
Magenta foreground color.
static const Style red
Red foreground color.
static const Style cyan
Cyan foreground color.
static const Style blue
Blue foreground color.
static const Style bold
Bold text formatting.
virtual std::string style(const std::string &text, Style styles) const =0
Applies styling to a text string.
const TextFormatter & formatter() const
void assert_or_panic(bool condition, const StringViewSourceLoc &s)
Conditionally panics if the given condition is false.
Definition panic.cpp:53