//# This file is a part of toml++ and is subject to the the terms of the MIT license. //# Copyright (c) Mark Gillard //# See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text. // SPDX-License-Identifier: MIT #pragma once #include "preprocessor.h" #if TOML_ENABLE_FORMATTERS #include "forward_declarations.h" #include "print_to_stream.h" #include "header_start.h" /// \cond TOML_IMPL_NAMESPACE_START { struct formatter_constants { format_flags mandatory_flags; format_flags ignored_flags; std::string_view float_pos_inf; std::string_view float_neg_inf; std::string_view float_nan; std::string_view bool_true; std::string_view bool_false; }; struct formatter_config { format_flags flags; std::string_view indent; }; class TOML_EXPORTED_CLASS formatter { private: const node* source_; #if TOML_ENABLE_PARSER && !TOML_EXCEPTIONS const parse_result* result_; #endif const formatter_constants* constants_; formatter_config config_; size_t indent_columns_; format_flags int_format_mask_; std::ostream* stream_; // int indent_; // these are set in attach() bool naked_newline_; // protected: TOML_PURE_INLINE_GETTER const node& source() const noexcept { return *source_; } TOML_PURE_INLINE_GETTER std::ostream& stream() const noexcept { return *stream_; } TOML_PURE_INLINE_GETTER int indent() const noexcept { return indent_; } void indent(int level) noexcept { indent_ = level; } void increase_indent() noexcept { indent_++; } void decrease_indent() noexcept { indent_--; } TOML_PURE_INLINE_GETTER size_t indent_columns() const noexcept { return indent_columns_; } TOML_PURE_INLINE_GETTER bool indent_array_elements() const noexcept { return !!(config_.flags & format_flags::indent_array_elements); } TOML_PURE_INLINE_GETTER bool indent_sub_tables() const noexcept { return !!(config_.flags & format_flags::indent_sub_tables); } TOML_PURE_INLINE_GETTER bool literal_strings_allowed() const noexcept { return !!(config_.flags & format_flags::allow_literal_strings); } TOML_PURE_INLINE_GETTER bool multi_line_strings_allowed() const noexcept { return !!(config_.flags & format_flags::allow_multi_line_strings); } TOML_PURE_INLINE_GETTER bool real_tabs_in_strings_allowed() const noexcept { return !!(config_.flags & format_flags::allow_real_tabs_in_strings); } TOML_PURE_INLINE_GETTER bool unicode_strings_allowed() const noexcept { return !!(config_.flags & format_flags::allow_unicode_strings); } TOML_PURE_INLINE_GETTER bool terse_kvps() const noexcept { return !!(config_.flags & format_flags::terse_key_value_pairs); } TOML_EXPORTED_MEMBER_FUNCTION void attach(std::ostream& stream) noexcept; TOML_EXPORTED_MEMBER_FUNCTION void detach() noexcept; TOML_EXPORTED_MEMBER_FUNCTION void print_newline(bool force = false); TOML_EXPORTED_MEMBER_FUNCTION void print_indent(); TOML_EXPORTED_MEMBER_FUNCTION void print_unformatted(char); TOML_EXPORTED_MEMBER_FUNCTION void print_unformatted(std::string_view); TOML_EXPORTED_MEMBER_FUNCTION void print_string(std::string_view str, bool allow_multi_line = true, bool allow_bare = false); TOML_EXPORTED_MEMBER_FUNCTION void print(const value&); TOML_EXPORTED_MEMBER_FUNCTION void print(const value&); TOML_EXPORTED_MEMBER_FUNCTION void print(const value&); TOML_EXPORTED_MEMBER_FUNCTION void print(const value&); TOML_EXPORTED_MEMBER_FUNCTION void print(const value&); TOML_EXPORTED_MEMBER_FUNCTION void print(const value