@@ -178,6 +178,54 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
178178 }, \
179179 }
180180
181+ /**
182+ * @internal @brief Helper macro to declare an element descriptor
183+ *
184+ * @param struct_ Struct packing the values
185+ * @param len_field_ Field name in the struct for the number of elements
186+ * in the array
187+ * @param elem_type_ Element type, must be a primitive type
188+ * @param union_ Optional macro argument containing array or object descriptor
189+ */
190+ #define Z_JSON_ELEMENT_DESCR (struct_ , len_field_ , elem_type_ , union_ ) \
191+ (const struct json_obj_descr[]) \
192+ { \
193+ { \
194+ .align_shift = Z_ALIGN_SHIFT(struct_), \
195+ .type = elem_type_, \
196+ .offset = offsetof(struct_, len_field_), \
197+ union_ \
198+ } \
199+ }
200+
201+ /**
202+ * @internal @brief Helper macro to declare an array descriptor
203+ *
204+ * @param elem_descr_ Element descriptor, pointer to a descriptor array
205+ * @param elem_descr_len_ Number of elements in elem_descr_
206+ */
207+ #define Z_JSON_DESCR_ARRAY (elem_descr_ , elem_descr_len_ ) \
208+ { \
209+ .array = { \
210+ .element_descr = elem_descr_, \
211+ .n_elements = elem_descr_len_, \
212+ }, \
213+ }
214+
215+ /**
216+ * @internal @brief Helper macro to declare an object descriptor
217+ *
218+ * @param elem_descr_ Element descriptor, pointer to a descriptor array
219+ * @param elem_descr_len_ Number of elements in elem_descr_
220+ */
221+ #define Z_JSON_DESCR_OBJ (elem_descr_ , elem_descr_len_ ) \
222+ { \
223+ .object = { \
224+ .sub_descr = elem_descr_, \
225+ .sub_descr_len = elem_descr_len_, \
226+ }, \
227+ }
228+
181229/**
182230 * @brief Helper macro to declare a descriptor for an array of primitives
183231 *
@@ -210,14 +258,8 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
210258 .offset = offsetof(struct_, field_name_), \
211259 { \
212260 .array = { \
213- .element_descr = (struct json_obj_descr[]) { { \
214- .align_shift = \
215- Z_ALIGN_SHIFT(struct_), \
216- .type = elem_type_, \
217- .offset = \
218- offsetof(struct_, \
219- len_field_), \
220- } }, \
261+ .element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
262+ elem_type_,), \
221263 .n_elements = (max_len_), \
222264 }, \
223265 }, \
@@ -267,21 +309,9 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
267309 .offset = offsetof(struct_, field_name_), \
268310 { \
269311 .array = { \
270- .element_descr = (struct json_obj_descr[]) { { \
271- .align_shift = \
272- Z_ALIGN_SHIFT(struct_), \
273- .type = JSON_TOK_OBJECT_START, \
274- .offset = offsetof(struct_, \
275- len_field_), \
276- { \
277- .object = { \
278- .sub_descr = \
279- elem_descr_, \
280- .sub_descr_len = \
281- elem_descr_len_, \
282- }, \
283- }, \
284- } }, \
312+ .element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
313+ JSON_TOK_OBJECT_START, \
314+ Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
285315 .n_elements = (max_len_), \
286316 }, \
287317 }, \
@@ -340,24 +370,11 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
340370 .offset = offsetof(struct_, field_name_), \
341371 { \
342372 .array = { \
343- .element_descr = (struct json_obj_descr[]) { { \
344- .align_shift = \
345- Z_ALIGN_SHIFT(struct_), \
346- .type = JSON_TOK_ARRAY_START, \
347- .offset = offsetof(struct_, \
348- len_field_), \
349- { \
350- .array = { \
351- .element_descr = \
352- elem_descr_, \
353- .n_elements = \
354- 1 + \
355- ZERO_OR_COMPILE_ERROR( \
356- elem_descr_len_ == 1 \
357- ), \
358- }, \
359- }, \
360- } }, \
373+ .element_descr = Z_JSON_ELEMENT_DESCR( \
374+ struct_, len_field_, JSON_TOK_ARRAY_START, \
375+ Z_JSON_DESCR_ARRAY( \
376+ elem_descr_, \
377+ 1 + ZERO_OR_COMPILE_ERROR(elem_descr_len_ == 1))), \
361378 .n_elements = (max_len_), \
362379 }, \
363380 }, \
@@ -443,13 +460,8 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
443460 .offset = offsetof(struct_, struct_field_name_), \
444461 { \
445462 .array = { \
446- .element_descr = (struct json_obj_descr[]) { { \
447- .align_shift = \
448- Z_ALIGN_SHIFT(struct_), \
449- .type = elem_type_, \
450- .offset = offsetof(struct_, \
451- len_field_), \
452- } }, \
463+ .element_descr = \
464+ Z_JSON_ELEMENT_DESCR(struct_, len_field_, elem_type_,), \
453465 .n_elements = (max_len_), \
454466 }, \
455467 }, \
@@ -507,21 +519,9 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
507519 .offset = offsetof(struct_, struct_field_name_), \
508520 { \
509521 .array = { \
510- .element_descr = (struct json_obj_descr[]) { { \
511- .align_shift = \
512- Z_ALIGN_SHIFT(struct_), \
513- .type = JSON_TOK_OBJECT_START, \
514- .offset = offsetof(struct_, \
515- len_field_), \
516- { \
517- .object = { \
518- .sub_descr = \
519- elem_descr_, \
520- .sub_descr_len = \
521- elem_descr_len_, \
522- }, \
523- }, \
524- } }, \
522+ .element_descr = Z_JSON_ELEMENT_DESCR(struct_, len_field_, \
523+ JSON_TOK_OBJECT_START, \
524+ Z_JSON_DESCR_OBJ(elem_descr_, elem_descr_len_)), \
525525 .n_elements = (max_len_), \
526526 }, \
527527 }, \
0 commit comments