/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.47k | void JsonProtoConverter::AppendArray(const ArrayValue& array_value) { |
10 | 1.47k | data_ << '['; |
11 | 1.47k | bool need_comma = false; |
12 | 7.08k | for (const auto& value : array_value.value()) { |
13 | | // Trailing comma inside of an array makes JSON invalid, avoid adding that. |
14 | 7.08k | if (need_comma) |
15 | 6.17k | data_ << ','; |
16 | 907 | else |
17 | 907 | need_comma = true; |
18 | | |
19 | 7.08k | AppendValue(value); |
20 | 7.08k | } |
21 | 1.47k | data_ << ']'; |
22 | 1.47k | } |
23 | | |
24 | 1.54k | void JsonProtoConverter::AppendNumber(const NumberValue& number_value) { |
25 | 1.54k | if (number_value.has_float_value()) { |
26 | 226 | data_ << number_value.float_value().value(); |
27 | 1.31k | } else if (number_value.has_exponent_value()) { |
28 | 307 | auto value = number_value.exponent_value(); |
29 | 307 | data_ << value.base(); |
30 | 307 | data_ << (value.use_uppercase() ? 'E' : 'e'); |
31 | 307 | data_ << value.exponent(); |
32 | 1.01k | } else if (number_value.has_exponent_frac_value()) { |
33 | 213 | auto value = number_value.exponent_value(); |
34 | 213 | data_ << value.base(); |
35 | 213 | data_ << (value.use_uppercase() ? 'E' : 'e'); |
36 | 213 | data_ << value.exponent(); |
37 | 798 | } else { |
38 | 798 | data_ << number_value.integer_value().value(); |
39 | 798 | } |
40 | 1.54k | } |
41 | | |
42 | 4.78k | void JsonProtoConverter::AppendObject(const JsonObject& json_object) { |
43 | 4.78k | data_ << '{' << '"' << json_object.name() << '"' << ':'; |
44 | 4.78k | AppendValue(json_object.value()); |
45 | 4.78k | data_ << '}'; |
46 | 4.78k | } |
47 | | |
48 | 11.8k | void JsonProtoConverter::AppendValue(const JsonValue& json_value) { |
49 | 11.8k | if (json_value.has_object_value()) { |
50 | 1.99k | AppendObject(json_value.object_value()); |
51 | 9.86k | } else if (json_value.has_array_value()) { |
52 | 1.47k | AppendArray(json_value.array_value()); |
53 | 8.38k | } else if (json_value.has_number_value()) { |
54 | 1.54k | AppendNumber(json_value.number_value()); |
55 | 6.84k | } else if (json_value.has_string_value()) { |
56 | 1.35k | data_ << '"' << json_value.string_value().value() << '"'; |
57 | 5.48k | } else if (json_value.has_boolean_value()) { |
58 | 416 | data_ << (json_value.boolean_value().value() ? "true" : "false"); |
59 | 5.07k | } else { |
60 | 5.07k | data_ << "null"; |
61 | 5.07k | } |
62 | 11.8k | } |
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 |