blob: 16bffc93b9edd4fcc89c2e72689111a416653462 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
// # This file is a part of toml++ and is subject to the the terms of the MIT license.
// # Copyright (c) Mark Gillard <mark.gillard@outlook.com.au>
// # See https://github.com/marzer/tomlplusplus/blob/master/LICENSE for the full license text.
// SPDX-License-Identifier: MIT
#pragma once
#include "preprocessor.hpp"
// # {{
#if !TOML_IMPLEMENTATION
#error This is an implementation-only header.
#endif
// # }}
#if TOML_ENABLE_FORMATTERS
#include "array.hpp"
#include "header_start.hpp"
#include "json_formatter.hpp"
#include "print_to_stream.hpp"
#include "table.hpp"
TOML_NAMESPACE_START {
TOML_EXTERNAL_LINKAGE
void json_formatter::print(const toml::table& tbl) {
if (tbl.empty()) {
print_unformatted("{}"sv);
return;
}
print_unformatted('{');
if (indent_sub_tables()) increase_indent();
bool first = false;
for (auto&& [k, v] : tbl) {
if (first) print_unformatted(',');
first = true;
print_newline(true);
print_indent();
print_string(k.str(), false);
if (terse_kvps())
print_unformatted(":"sv);
else
print_unformatted(" : "sv);
const auto type = v.type();
TOML_ASSUME(type != node_type::none);
switch (type) {
case node_type::table:
print(*reinterpret_cast<const table*>(&v));
break;
case node_type::array:
print(*reinterpret_cast<const array*>(&v));
break;
default:
print_value(v, type);
}
}
if (indent_sub_tables()) decrease_indent();
print_newline(true);
print_indent();
print_unformatted('}');
}
TOML_EXTERNAL_LINKAGE
void json_formatter::print(const toml::array& arr) {
if (arr.empty()) {
print_unformatted("[]"sv);
return;
}
print_unformatted('[');
if (indent_array_elements()) increase_indent();
for (size_t i = 0; i < arr.size(); i++) {
if (i > 0u) print_unformatted(',');
print_newline(true);
print_indent();
auto& v = arr[i];
const auto type = v.type();
TOML_ASSUME(type != node_type::none);
switch (type) {
case node_type::table:
print(*reinterpret_cast<const table*>(&v));
break;
case node_type::array:
print(*reinterpret_cast<const array*>(&v));
break;
default:
print_value(v, type);
}
}
if (indent_array_elements()) decrease_indent();
print_newline(true);
print_indent();
print_unformatted(']');
}
TOML_EXTERNAL_LINKAGE
void json_formatter::print() {
if (dump_failed_parse_result()) return;
switch (auto source_type = source().type()) {
case node_type::table:
print(*reinterpret_cast<const table*>(&source()));
break;
case node_type::array:
print(*reinterpret_cast<const array*>(&source()));
break;
default:
print_value(source(), source_type);
}
}
}
TOML_NAMESPACE_END;
#include "header_end.hpp"
#endif // TOML_ENABLE_FORMATTERS
|