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