/src/cryptsetup/tests/fuzz/json_proto_converter.cc
Line | Count | Source |
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.45k | void JsonProtoConverter::AppendArray(const ArrayValue& array_value) { |
10 | 1.45k | data_ << '['; |
11 | 1.45k | bool need_comma = false; |
12 | 6.94k | for (const auto& value : array_value.value()) { |
13 | | // Trailing comma inside of an array makes JSON invalid, avoid adding that. |
14 | 6.94k | if (need_comma) |
15 | 6.06k | data_ << ','; |
16 | 887 | else |
17 | 887 | need_comma = true; |
18 | | |
19 | 6.94k | AppendValue(value); |
20 | 6.94k | } |
21 | 1.45k | data_ << ']'; |
22 | 1.45k | } |
23 | | |
24 | 1.42k | void JsonProtoConverter::AppendNumber(const NumberValue& number_value) { |
25 | 1.42k | if (number_value.has_float_value()) { |
26 | 224 | data_ << number_value.float_value().value(); |
27 | 1.20k | } else if (number_value.has_exponent_value()) { |
28 | 305 | auto value = number_value.exponent_value(); |
29 | 305 | data_ << value.base(); |
30 | 305 | data_ << (value.use_uppercase() ? 'E' : 'e'); |
31 | 305 | data_ << value.exponent(); |
32 | 899 | } else if (number_value.has_exponent_frac_value()) { |
33 | 212 | auto value = number_value.exponent_value(); |
34 | 212 | data_ << value.base(); |
35 | 212 | data_ << (value.use_uppercase() ? 'E' : 'e'); |
36 | 212 | data_ << value.exponent(); |
37 | 687 | } else { |
38 | 687 | data_ << number_value.integer_value().value(); |
39 | 687 | } |
40 | 1.42k | } |
41 | | |
42 | 4.73k | void JsonProtoConverter::AppendObject(const JsonObject& json_object) { |
43 | 4.73k | data_ << '{' << '"' << json_object.name() << '"' << ':'; |
44 | 4.73k | AppendValue(json_object.value()); |
45 | 4.73k | data_ << '}'; |
46 | 4.73k | } |
47 | | |
48 | 11.6k | void JsonProtoConverter::AppendValue(const JsonValue& json_value) { |
49 | 11.6k | if (json_value.has_object_value()) { |
50 | 1.95k | AppendObject(json_value.object_value()); |
51 | 9.73k | } else if (json_value.has_array_value()) { |
52 | 1.45k | AppendArray(json_value.array_value()); |
53 | 8.27k | } else if (json_value.has_number_value()) { |
54 | 1.42k | AppendNumber(json_value.number_value()); |
55 | 6.84k | } else if (json_value.has_string_value()) { |
56 | 1.24k | data_ << '"' << json_value.string_value().value() << '"'; |
57 | 5.60k | } else if (json_value.has_boolean_value()) { |
58 | 405 | data_ << (json_value.boolean_value().value() ? "true" : "false"); |
59 | 5.19k | } else { |
60 | 5.19k | data_ << "null"; |
61 | 5.19k | } |
62 | 11.6k | } |
63 | | |
64 | 2.78k | std::string JsonProtoConverter::Convert(const JsonObject& json_object) { |
65 | 2.78k | AppendObject(json_object); |
66 | 2.78k | return data_.str(); |
67 | 2.78k | } |
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 |