| // Copyright lowRISC contributors. |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. |
| // SPDX-License-Identifier: Apache-2.0 |
| |
| #ifndef OPENTITAN_SW_DEVICE_LIB_UJSON_EXAMPLE_H_ |
| #define OPENTITAN_SW_DEVICE_LIB_UJSON_EXAMPLE_H_ |
| #include "sw/device/lib/ujson/ujson_derive.h" |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| // clang-format off |
| ///////////////////////////////////////////////////////////////////////////// |
| // Automatic generation of structs with serialize/deserialize functions: |
| // |
| // The follow creates a `struct Foo`: |
| // typedef struct Foo { |
| // int32_t foo; |
| // uint32_t bar; |
| // char message[20]; |
| // } foo; |
| // status_t ujson_serialize_foo(ujson_t *context, const foo *self); |
| // status_t ujson_deserialize_foo(ujson_t *context, foo *self); |
| #define STRUCT_FOO(field, string) \ |
| field(foo, int32_t) \ |
| field(bar, uint32_t) \ |
| string(message, 20) |
| UJSON_SERDE_STRUCT(Foo, foo, STRUCT_FOO); |
| |
| // The next two structs demonstrate struct nesting: |
| // typedef struct Coord { int32_t x; int32_t y; } coord; |
| // |
| // typedef struct Rect { |
| // coord top_left; |
| // coord bottom_right; |
| // } rect; |
| // status_t ujson_serialize_rect(ujson_t *context, const rect *self); |
| // status_t ujson_deserialize_rect(ujson_t *context, rect *self); |
| // (and yes: `coord` has serialize and deserialize functions as well). |
| #define STRUCT_COORD(field, string) \ |
| field(x, int32_t) \ |
| field(y, int32_t) |
| UJSON_SERDE_STRUCT(Coord, coord, STRUCT_COORD); |
| |
| #define STRUCT_RECT(field, string) \ |
| field(top_left, coord) \ |
| field(bottom_right, coord) |
| UJSON_SERDE_STRUCT(Rect, rect, STRUCT_RECT); |
| |
| // The next example demonstrates arrays within struct fields: |
| // struct Matrix { |
| // int32_t k[3][5]; |
| // } matrix; |
| // (and serialize/deserialize functions). |
| // |
| // Arrays may have arbitrary dimension. However, ujson has no concept |
| // of a variable sized array: |
| // - Serialize will always emit _all_ elements. |
| // - Deserialize will _not_ initialize absent elements. |
| #define STRUCT_MATRIX(field, string) \ |
| field(k, int32_t, 3, 5) |
| UJSON_SERDE_STRUCT(Matrix, matrix, STRUCT_MATRIX); |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Automatic generation of enums with serialize/deserialize functions: |
| // |
| // The following creates an `enum Direction`: |
| // typedef enum Direction { |
| // kDirectionNorth, |
| // kDirectionEast, |
| // kDirectionSouth, |
| // kDirectionWest, |
| // } direction; |
| // status_t ujson_serialize_direction(ujson_t *context, const direction *self); |
| // status_t ujson_deserialize_direction(ujson_t *context, direction *self); |
| #define ENUM_DIRECTION(_, value) \ |
| value(_, North) \ |
| value(_, East) \ |
| value(_, South) \ |
| value(_, West) |
| UJSON_SERDE_ENUM(Direction, direction, ENUM_DIRECTION); |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Automatic generation of C enums corresponding to rust `with_unknown!` enums |
| // |
| // The following creates an `enum FuzzyBool`: |
| // typedef enum FuzzyBool { |
| // kFuzzyBoolFalse = 0, |
| // FuzzyBoolTrue = 100, |
| // } fuzzy_bool; |
| // status_t ujson_serialize_fuzzy_bool(ujson_t *context, const fuzzy_bool *self); |
| // status_t ujson_deserialize_fuzzy_bool(ujson_t *context, fuzzy_bool *self); |
| #define ENUM_FUZZY_BOOL(_, value) \ |
| value(_, False, 0) \ |
| value(_, True, 100) |
| C_ONLY(UJSON_SERDE_ENUM(FuzzyBool, fuzzy_bool, ENUM_FUZZY_BOOL, WITH_UNKNOWN)); |
| |
| ///////////////////////////////////////////////////////////////////////////// |
| // Other miscellaneous supported types: bool and status_t |
| // |
| // status_t ujson_serialize_misc_t(ujson_t *context, const misc_t *self); |
| // status_t ujson_deserialize_misc_t(ujson_t *context, misc_t *self); |
| #define STRUCT_MISC(field, string) \ |
| field(value, bool) \ |
| field(status, status_t) |
| UJSON_SERDE_STRUCT(Misc, misc_t, STRUCT_MISC); |
| |
| // clang-format on |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| #endif // OPENTITAN_SW_DEVICE_LIB_UJSON_EXAMPLE_H_ |