Skip to content

Commit 4a3406c

Browse files
authored
Merge pull request #147 from StephanDollberg/stephan/downstream-json
Downstream more json improvements
2 parents 4350d79 + b3f9132 commit 4a3406c

File tree

2 files changed

+58
-14
lines changed

2 files changed

+58
-14
lines changed

include/seastar/json/formatter.hh

+4-4
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,11 @@ class formatter {
104104
static future<> write(output_stream<char>& stream, state s, Iter i, Iter e) {
105105
return do_with(true, [&stream, s, i, e] (bool& first) {
106106
return stream.write(begin(s)).then([&first, &stream, s, i, e] {
107-
return do_for_each(i, e, [&first, &stream] (auto& m) {
107+
return do_for_each(i, e, [&first, &stream, s] (auto& m) {
108108
auto f = (first) ? make_ready_future<>() : stream.write(",");
109109
first = false;
110-
return f.then([&m, &stream] {
111-
return write(stream, m);
110+
return f.then([&m, &stream, s] {
111+
return write(stream, s, m);
112112
});
113113
}).then([&stream, s] {
114114
return stream.write(end(s));
@@ -120,7 +120,7 @@ class formatter {
120120
// fallback template
121121
template<typename T>
122122
static future<> write(output_stream<char>& stream, state, const T& t) {
123-
return stream.write(to_json(t));
123+
return write(stream, t);
124124
}
125125

126126
public:

tests/unit/json_formatter_test.cc

+54-10
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,15 @@ SEASTAR_TEST_CASE(test_jsonable) {
9191
return make_ready_future();
9292
}
9393

94-
SEASTAR_THREAD_TEST_CASE(test_stream_range_as_array) {
94+
template<typename F>
95+
void formatter_check_expected(sstring expected, F f, bool close = true) {
9596
auto vec = std::vector<net::packet>{};
9697
auto out = output_stream<char>(data_sink(std::make_unique<vector_data_sink>(vec)), 8);
9798

98-
auto mapper = stream_range_as_array(std::vector<int>{1,2,3}, [] (auto i) {
99-
object_json obj;
100-
obj.subject = std::to_string(i);
101-
obj.values.push(i);
102-
return obj;
103-
});
104-
105-
mapper(std::move(out)).get();
99+
f(out);
100+
if (close) {
101+
out.close().get();
102+
}
106103

107104
auto packets = net::packet{};
108105
for (auto &p : vec) {
@@ -112,6 +109,53 @@ SEASTAR_THREAD_TEST_CASE(test_stream_range_as_array) {
112109
auto buf = packets.release();
113110

114111
sstring result(buf.front().get(), buf.front().size());
115-
sstring expected = "[{\"subject\":\"1\",\"values\":[1]}, {\"subject\":\"2\",\"values\":[2]}, {\"subject\":\"3\",\"values\":[3]}]";
116112
BOOST_CHECK_EQUAL(expected, result);
117113
}
114+
115+
116+
SEASTAR_THREAD_TEST_CASE(test_stream_range_as_array) {
117+
sstring expected = R"([{"subject":"1","values":[1]}, {"subject":"2","values":[2]}, {"subject":"3","values":[3]}])";
118+
formatter_check_expected(expected, [] (auto& out) {
119+
auto mapper = stream_range_as_array(std::vector<int>{1,2,3}, [] (auto i) {
120+
object_json obj;
121+
obj.subject = std::to_string(i);
122+
obj.values.push(i);
123+
return obj;
124+
});
125+
126+
mapper(std::move(out)).get();
127+
}, false);
128+
}
129+
130+
SEASTAR_THREAD_TEST_CASE(formatter_write) {
131+
132+
formatter_check_expected("3", [] (auto &out) {
133+
json::formatter::write(out, 3).get();
134+
});
135+
formatter_check_expected("false", [] (auto &out) {
136+
json::formatter::write(out, false).get();
137+
});
138+
formatter_check_expected("\"foo\"", [] (auto &out) {
139+
json::formatter::write(out, "foo").get();
140+
});
141+
142+
formatter_check_expected("{1:2,3:4}", [] (auto& out) {
143+
json::formatter::write(out, std::map<int, int>({{1, 2}, {3, 4}})).get();
144+
});
145+
formatter_check_expected("{3:4,1:2}", [] (auto& out) {
146+
json::formatter::write(out, std::unordered_map<int, int>({{1, 2}, {3, 4}})).get();
147+
});
148+
formatter_check_expected("[1,2,3,4]", [] (auto &out) {
149+
json::formatter::write(out, std::vector<int>({1, 2, 3, 4})).get();
150+
});
151+
152+
formatter_check_expected("[{1:2},{3:4}]", [] (auto &out) {
153+
json::formatter::write(out, std::vector<std::pair<int, int>>({{1, 2}, {3, 4}})).get();
154+
});
155+
formatter_check_expected("[{1:2},{3:4}]", [] (auto &out) {
156+
json::formatter::write(out, std::vector<std::map<int, int>>({{{1, 2}}, {{3, 4}}})).get();
157+
});
158+
formatter_check_expected("[[1,2],[3,4]]", [] (auto &out) {
159+
json::formatter::write(out, std::vector<std::vector<int>>({{1, 2}, {3, 4}})).get();
160+
});
161+
}

0 commit comments

Comments
 (0)