1#ifndef SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H
2#define SIMDJSON_INTERNAL_FRACTURED_FORMATTER_H
4#include "simdjson/dom/serialization.h"
5#include "simdjson/dom/fractured_json.h"
6#include "simdjson/internal/json_structure_analyzer.h"
18class fractured_formatter :
public base_formatter<fractured_formatter> {
20 explicit fractured_formatter(
const fractured_json_options& opts = {});
23 simdjson_inline
void print_newline();
26 simdjson_inline
void print_indents(
size_t depth);
29 simdjson_inline
void print_space();
32 void set_layout_mode(layout_mode mode);
35 layout_mode get_layout_mode()
const;
38 void track_line_length(
size_t chars);
41 bool should_break_line(
size_t upcoming_length)
const;
44 const fractured_json_options& options()
const;
47 fractured_json_options options_;
48 layout_mode current_layout_ = layout_mode::expanded;
49 size_t current_line_length_ = 0;
53class scoped_single_line_mode {
55 explicit scoped_single_line_mode(fractured_formatter& format)
56 : format_(format), prev_(format.get_layout_mode()) {
57 format_.set_layout_mode(layout_mode::single_line);
59 ~scoped_single_line_mode() { format_.set_layout_mode(prev_); }
60 scoped_single_line_mode(
const scoped_single_line_mode&) =
delete;
61 scoped_single_line_mode& operator=(
const scoped_single_line_mode&) =
delete;
64 fractured_formatter& format_;
75class fractured_string_builder {
77 fractured_string_builder(
const fractured_json_options& opts = {});
80 void append(
const dom::element& value);
83 void append(
const dom::array& value);
86 void append(
const dom::object& value);
89 simdjson_inline
void clear();
92 simdjson_inline std::string_view str()
const;
95 fractured_formatter format_;
96 structure_analyzer analyzer_;
97 fractured_json_options options_;
100 void format_element(
const dom::element& elem,
const element_metrics& metrics,
size_t depth,
101 bool has_trailing_comma =
false);
104 void format_array(
const dom::array& arr,
const element_metrics& metrics,
size_t depth,
105 bool has_trailing_comma =
false);
108 void format_array_inline(
const dom::array& arr,
const element_metrics& metrics);
111 void format_array_compact_multiline(
const dom::array& arr,
const element_metrics& metrics,
size_t depth);
115 void format_array_compact_multiline_aligned(
const dom::array& arr,
const element_metrics& metrics,
size_t depth);
118 void format_array_as_table(
const dom::array& arr,
const element_metrics& metrics,
size_t depth);
121 void format_table_object_row(
const dom::object& obj,
const element_metrics& row_metrics,
122 const std::vector<table_column>& columns,
size_t depth);
125 void format_table_array_row(
const dom::array& arr,
const element_metrics& row_metrics,
126 const std::vector<table_column>& columns,
size_t depth);
129 void format_table_row(
const dom::element& elem,
const element_metrics& row_metrics,
130 const std::vector<table_column>& columns,
size_t depth);
133 void format_table_scalar_row(
const dom::element& elem,
const element_metrics& row_metrics,
134 size_t width,
size_t depth, table_column_type column_type);
138 void format_table_row_columns(
const std::vector<table_column>& columns,
139 const std::vector<bool>& found,
140 const std::vector<dom::element>& values,
141 const std::vector<const element_metrics*>& value_metrics,
145 void format_table_leaf_value(
const dom::element& elem,
const element_metrics& vm,
size_t width,
146 table_column_type column_type,
bool needs_comma,
147 bool add_comma_space,
size_t depth);
150 bool comma_goes_before_padding(table_column_type column_type)
const;
153 void format_array_expanded(
const dom::array& arr,
const element_metrics& metrics,
size_t depth);
156 void format_object(
const dom::object& obj,
const element_metrics& metrics,
size_t depth,
157 bool has_trailing_comma =
false);
160 void format_object_inline(
const dom::object& obj,
const element_metrics& metrics);
163 void format_object_expanded(
const dom::object& obj,
const element_metrics& metrics,
size_t depth);
166 void format_scalar(
const dom::element& elem);
169 bool bracket_padding_for(
const element_metrics& metrics)
const;
The top level simdjson namespace, containing everything the library provides.