summaryrefslogtreecommitdiffhomepage
path: root/vendor/toml++/impl/json_formatter.inl
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