/* * Copyright (c) 2024, Dan Klishch * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace JSSpecCompiler { class Printer { public: template void block(Func&& func, StringView start = "{"sv, StringView end = "}"sv) { formatln("{}", start); ++indent_level; func(); --indent_level; format("{}", end); } template void format(AK::CheckedFormatString&& fmtstr, Parameters const&... parameters) { if (builder.string_view().ends_with('\n')) builder.append_repeated(' ', indent_level * 4); builder.appendff(move(fmtstr), forward(parameters)...); } template void formatln(AK::CheckedFormatString&& fmtstr, Parameters const&... parameters) { format(move(fmtstr), forward(parameters)...); builder.append("\n"sv); } StringView view() const { return builder.string_view(); } private: StringBuilder builder; size_t indent_level = 0; }; }