AsmGrader 0.0.0
Loading...
Searching...
No Matches
plaintext_serializer.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "api/requirement.hpp"
4#include "api/stringize.hpp"
5#include "grading_session.hpp"
7#include "output/sink.hpp"
10
11#include <fmt/base.h>
12#include <fmt/color.h>
13#include <fmt/format.h>
14
15#include <cstddef>
16#include <string>
17#include <string_view>
18#include <unordered_map>
19
20namespace asmgrader {
21
23{
24public:
25 PlainTextSerializer(Sink& sink, ProgramOptions::ColorizeOpt colorize_option, VerbosityLevel verbosity);
26
27 void on_student_begin(const StudentInfo& info) override;
28 void on_student_end(const StudentInfo& info) override;
29
30 void on_run_metadata(const RunMetadata& data) override;
31 void on_requirement_result(const RequirementResult& data) override;
32 void on_test_begin(std::string_view test_name) override;
33 void on_test_result(const TestResult& data) override;
34 void on_assignment_result(const AssignmentResult& data) override;
35
36 void on_warning(std::string_view what) override;
37 void on_error(std::string_view what) override;
38
39 void finalize() override;
40
41private:
42 std::string serialize_req_expr(const exprs::ExpressionRepr& expr);
43 std::string serialize_req_expr_simple(const exprs::ExpressionRepr& expr);
44 static bool process_colorize_opt(ProgramOptions::ColorizeOpt colorize_option);
45 static std::size_t get_terminal_width();
46
47 void output_grade_percentage(const AssignmentResult& data);
48
49 template <fmt::formattable T>
50 auto style(const T& arg, fmt::text_style style) const -> decltype(fmt::styled(arg, style));
51
52 template <fmt::formattable T>
53 std::string style_str(const T& arg, fmt::text_style style, fmt::format_string<T> fmt = "{}") const;
54
56 std::string maybe_highlight(const stringize::StringizeResult& what) const;
57
66 static std::string pluralize(std::string_view root, int count, std::string_view suffix = "s",
67 std::size_t replace_last_chars = 0);
68
69 // Basic styles for different kinds of output:
70 // error - FAILED messages, fatal errors, etc.
71 // success - PASSED messages
72 // header - section header (like "String Test Results:")
73 // value - for variables or literal values referenced for test requirements
74 static constexpr auto ERROR_STYLE = fmt::fg(fmt::color::red) | fmt::emphasis::bold;
75 static constexpr auto WARNING_STYLE = fmt::fg(fmt::color::yellow) | fmt::emphasis::bold;
76 static constexpr auto SUCCESS_STYLE = fmt::fg(fmt::color::lime_green);
77 static constexpr auto POP_OUT_STYLE =
78 fmt::emphasis::underline | fmt::emphasis::bold | fmt::fg(fmt::color::golden_rod);
79 static constexpr auto VALUE_STYLE = fmt::fg(fmt::color::aqua);
80
81 static constexpr std::size_t DEFAULT_WIDTH = 80;
82
83 static constexpr auto MAKE_LINE_DIVIDER = [](char chr) {
84 return [chr](std::size_t len) { return std::string(len, chr); };
85 };
86
87 // Basic line dividers to seperate output, parameterized on length
88 // Line Divider 2x Emphasized : "#######"...
89 // Line Divider Emphasized : "======="...
90 // Line Divider : "--------...
91 static const inline auto LINE_DIVIDER = MAKE_LINE_DIVIDER('-');
92 static const inline auto LINE_DIVIDER_EM = MAKE_LINE_DIVIDER('=');
93 static const inline auto LINE_DIVIDER_2EM = MAKE_LINE_DIVIDER('#');
94
95 bool do_colorize_;
96 std::size_t terminal_width_;
97
100 std::unordered_map<std::string, std::size_t> repeat_requirements_;
101};
102
103template <fmt::formattable T>
104auto PlainTextSerializer::style(const T& arg, fmt::text_style style) const -> decltype(fmt::styled(arg, style)) {
105 if (!do_colorize_) {
106 return fmt::styled(arg, {});
107 }
108 return fmt::styled(arg, style);
109}
110
111template <fmt::formattable T>
112std::string PlainTextSerializer::style_str(const T& arg, fmt::text_style style, fmt::format_string<T> fmt) const {
113 if (!do_colorize_) {
114 return fmt::vformat(fmt.str, fmt::vargs<T>{arg});
115 }
116
117 return fmt::vformat(style, fmt.str, fmt::vargs<T>{arg});
118}
119
120} // namespace asmgrader
Definition plaintext_serializer.hpp:23
void on_student_begin(const StudentInfo &info) override
Definition plaintext_serializer.cpp:223
void on_run_metadata(const RunMetadata &data) override
Definition plaintext_serializer.cpp:308
void on_assignment_result(const AssignmentResult &data) override
Definition plaintext_serializer.cpp:129
void on_test_result(const TestResult &data) override
Definition plaintext_serializer.cpp:108
void on_error(std::string_view what) override
Definition plaintext_serializer.cpp:303
void on_test_begin(std::string_view test_name) override
Definition plaintext_serializer.cpp:98
PlainTextSerializer(Sink &sink, ProgramOptions::ColorizeOpt colorize_option, VerbosityLevel verbosity)
Definition plaintext_serializer.cpp:52
void finalize() override
Definition plaintext_serializer.cpp:194
void on_warning(std::string_view what) override
Definition plaintext_serializer.cpp:298
void on_requirement_result(const RequirementResult &data) override
Definition plaintext_serializer.cpp:58
void on_student_end(const StudentInfo &info) override
Definition plaintext_serializer.cpp:288
Definition serializer.hpp:14
Definition sink.hpp:8
Defines data classes to store result data for the current run session.
Definition asm_buffer.hpp:20
VerbosityLevel
See Description of Levels for an explaination of each of the levels. Max is just used as a sentinal f...
Definition verbosity.hpp:9
See asmgrader::stringize.
Definition grading_session.hpp:119
ColorizeOpt
Definition program_options.hpp:44
Definition grading_session.hpp:75
Definition grading_session.hpp:62
Definition grading_session.hpp:157
Definition grading_session.hpp:99
Representation of an expression with all components stringized.
Definition requirement.hpp:152
Result type of a call to str or repr
Definition stringize.hpp:39