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


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