/src/cryptsetup/tests/fuzz/json_proto_converter.cc
Line | Count | Source (jump to first uncovered line) |
1 | | // SPDX-License-Identifier: Apache-2.0 |
2 | | // |
3 | | // Copyright 2020 Google Inc. |
4 | | |
5 | | #include "json_proto_converter.h" |
6 | | |
7 | | namespace json_proto { |
8 | | |
9 | 1.50k | void JsonProtoConverter::AppendArray(const ArrayValue& array_value) { |
10 | 1.50k | data_ << '['; |
11 | 1.50k | bool need_comma = false; |
12 | 7.54k | for (const auto& value : array_value.value()) { |
13 | | // Trailing comma inside of an array makes JSON invalid, avoid adding that. |
14 | 7.54k | if (need_comma) |
15 | 6.60k | data_ << ','; |
16 | 941 | else |
17 | 941 | need_comma = true; |
18 | | |
19 | 7.54k | AppendValue(value); |
20 | 7.54k | } |
21 | 1.50k | data_ << ']'; |
22 | 1.50k | } |
23 | | |
24 | 1.60k | void JsonProtoConverter::AppendNumber(const NumberValue& number_value) { |
25 | 1.60k | if (number_value.has_float_value()) { |
26 | 253 | data_ << number_value.float_value().value(); |
27 | 1.35k | } else if (number_value.has_exponent_value()) { |
28 | 294 | auto value = number_value.exponent_value(); |
29 | 294 | data_ << value.base(); |
30 | 294 | data_ << (value.use_uppercase() ? 'E' : 'e'); |
31 | 294 | data_ << value.exponent(); |
32 | 1.06k | } else if (number_value.has_exponent_frac_value()) { |
33 | 230 | auto value = number_value.exponent_value(); |
34 | 230 | data_ << value.base(); |
35 | 230 | data_ << (value.use_uppercase() ? 'E' : 'e'); |
36 | 230 | data_ << value.exponent(); |
37 | 830 | } else { |
38 | 830 | data_ << number_value.integer_value().value(); |
39 | 830 | } |
40 | 1.60k | } |
41 | | |
42 | 5.07k | void JsonProtoConverter::AppendObject(const JsonObject& json_object) { |
43 | 5.07k | data_ << '{' << '"' << json_object.name() << '"' << ':'; |
44 | 5.07k | AppendValue(json_object.value()); |
45 | 5.07k | data_ << '}'; |
46 | 5.07k | } |
47 | | |
48 | 12.6k | void JsonProtoConverter::AppendValue(const JsonValue& json_value) { |
49 | 12.6k | if (json_value.has_object_value()) { |
50 | 2.16k | AppendObject(json_value.object_value()); |
51 | 10.4k | } else if (json_value.has_array_value()) { |
52 | 1.50k | AppendArray(json_value.array_value()); |
53 | 8.95k | } else if (json_value.has_number_value()) { |
54 | 1.60k | AppendNumber(json_value.number_value()); |
55 | 7.34k | } else if (json_value.has_string_value()) { |
56 | 1.37k | data_ << '"' << json_value.string_value().value() << '"'; |
57 | 5.97k | } else if (json_value.has_boolean_value()) { |
58 | 429 | data_ << (json_value.boolean_value().value() ? "true" : "false"); |
59 | 5.54k | } else { |
60 | 5.54k | data_ << "null"; |
61 | 5.54k | } |
62 | 12.6k | } |
63 | | |
64 | 2.91k | std::string JsonProtoConverter::Convert(const JsonObject& json_object) { |
65 | 2.91k | AppendObject(json_object); |
66 | 2.91k | return data_.str(); |
67 | 2.91k | } |
68 | | |
69 | | std::string JsonProtoConverter::Convert( |
70 | 0 | const json_proto::ArrayValue& json_array) { |
71 | 0 | AppendArray(json_array); |
72 | 0 | return data_.str(); |
73 | 0 | } |
74 | | |
75 | | } // namespace json_proto |