/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  |