@@ -43,25 +43,30 @@ void parameter_to_json_helper(const parameter_view &pv, T &output,
4343 break ;
4444 case parameter_type::map:
4545 output.SetObject ();
46- for (const auto &v : pv) {
46+ for (const auto &[k, v] : pv. map_iterable () ) {
4747 rapidjson::Value key;
4848 rapidjson::Value value;
4949 parameter_to_json_helper (v, value, alloc);
5050
51- std::string_view const sv = v.key ();
52- key.SetString (sv.data (), sv.size (), alloc);
51+ key.SetString (k.data (), k.size (), alloc);
5352
5453 output.AddMember (key, value, alloc);
5554 }
5655 break ;
5756 case parameter_type::array:
5857 output.SetArray ();
59- for (const auto &v : pv) {
58+ for (const auto &v : pv. array_iterable () ) {
6059 rapidjson::Value value;
6160 parameter_to_json_helper (v, value, alloc);
6261 output.PushBack (value, alloc);
6362 }
6463 break ;
64+ case parameter_type::float64:
65+ output.SetDouble (double (pv));
66+ break ;
67+ case parameter_type::null:
68+ output.SetNull ();
69+ break ;
6570 case parameter_type::invalid:
6671 throw std::runtime_error (" invalid parameter in structure" );
6772 };
@@ -97,60 +102,66 @@ template <typename T, typename = std::enable_if_t<std::disjunction_v<
97102// NOLINTNEXTLINE(misc-no-recursion)
98103void json_to_object (ddwaf_object *object, T &doc)
99104{
105+ static constexpr size_t default_capacity = 16 ;
106+ auto *alloc = ddwaf_get_default_allocator ();
107+
100108 switch (doc.GetType ()) {
101109 case rapidjson::kFalseType :
102- ddwaf_object_stringl (object, " false" , sizeof ( " false " ) - 1 );
110+ ddwaf_object_set_bool (object, false );
103111 break ;
104112 case rapidjson::kTrueType :
105- ddwaf_object_stringl (object, " true" , sizeof ( " true " ) - 1 );
113+ ddwaf_object_set_bool (object, true );
106114 break ;
107115 case rapidjson::kObjectType : {
108- ddwaf_object_map (object);
116+ ddwaf_object_set_map (object, default_capacity, alloc );
109117 for (auto &kv : doc.GetObject ()) {
110- ddwaf_object element;
111- json_to_object (&element, kv.value );
112-
113118 std::string_view const key = kv.name .GetString ();
114- ddwaf_object_map_addl (object, key.data (), key.length (), &element);
119+ ddwaf_object *element = ddwaf_object_insert_key (
120+ object, key.data (), key.length (), alloc);
121+ if (element) {
122+ json_to_object (element, kv.value );
123+ }
115124 }
116125 break ;
117126 }
118127 case rapidjson::kArrayType : {
119- ddwaf_object_array (object);
128+ ddwaf_object_set_array (object, default_capacity, alloc );
120129 for (auto &v : doc.GetArray ()) {
121- ddwaf_object element;
122- json_to_object (& element, v);
123-
124- ddwaf_object_array_add (object, &element);
130+ ddwaf_object * element = ddwaf_object_insert (object, alloc) ;
131+ if ( element) {
132+ json_to_object (element, v);
133+ }
125134 }
126135 break ;
127136 }
128137 case rapidjson::kStringType : {
129138 std::string_view const str = doc.GetString ();
130- ddwaf_object_stringl (object, str.data (), str.size ());
139+ ddwaf_object_set_string (object, str.data (), str.size (), alloc );
131140 break ;
132141 }
133142 case rapidjson::kNumberType : {
134143 if (doc.IsInt64 ()) {
135- ddwaf_object_signed (object, doc.GetInt64 ());
144+ ddwaf_object_set_signed (object, doc.GetInt64 ());
136145 } else if (doc.IsUint64 ()) {
137- ddwaf_object_unsigned (object, doc.GetUint64 ());
146+ ddwaf_object_set_unsigned (object, doc.GetUint64 ());
138147 } else if (doc.IsDouble ()) {
139- ddwaf_object_float (object, doc.GetDouble ());
148+ ddwaf_object_set_float (object, doc.GetDouble ());
140149 }
141150 break ;
142151 }
143152 case rapidjson::kNullType :
153+ ddwaf_object_set_null (object);
154+ break ;
144155 default :
145- ddwaf_object_invalid (object);
156+ ddwaf_object_set_invalid (object);
146157 break ;
147158 }
148159}
149160
150161dds::parameter json_to_parameter (const rapidjson::Value &value)
151162{
152163 dds::parameter obj;
153- json_to_object (obj, value);
164+ json_to_object (& obj, value);
154165 return obj;
155166}
156167
0 commit comments