// 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_UJSON_RUST_H_
#define OPENTITAN_SW_DEVICE_LIB_UJSON_UJSON_RUST_H_

// Definitions of the UJSON macros that emit code that can be trivially
// transformed into rust code:
//
// Preprocess the input, grep out all the preprocessor noise,
// translate `rust_attr` into `#` (rust attributes) and finally format the code:
//      gcc -nostdinc -I. -E -DRUST_PREPROCESSOR_EMIT <input_file> \
//          | grep -v '#' \
//          | sed -e "s/rust_attr/#/g" \
//          | rustfmt > output_file

#ifndef RUST_PREPROCESSOR_EMIT
#error "Do not include this file directly.  Include ujson_derive.h instead."
#endif  // RUST_PREPROCESSOR_EMIT
#include "sw/device/lib/base/adv_macros.h"

#define uint64_t u64
#define uint32_t u32
#define uint16_t u16
#define uint8_t u8
#define size_t usize

#define int64_t i64
#define int32_t i32
#define int16_t i16
#define int8_t i8

#define RUST_DEFAULT_DERIVE Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Eq

// clang-format off
rust_attr[allow(unused_imports)]
use opentitanlib::test_utils::status::status_t;

// clang-format is turned off; as scary as these macros look, they look
// even scarier after clang-format is done with them.
#define ujson_struct_field_array_indirect() ujson_struct_field_array
#define ujson_struct_field_array(t_, sz_, ...) \
    OT_IIF(OT_NOT(OT_VA_ARGS_COUNT(dummy, ##__VA_ARGS__))) \
    ( /*then*/ \
        [t_; sz_]\
    , /*else*/ \
        [OT_OBSTRUCT(ujson_struct_field_array_indirect)()(t_, __VA_ARGS__); sz_] \
    ) /*endif*/

#define ujson_struct_field(name_, type_, ...) \
    pub OT_IIF(OT_NOT(OT_VA_ARGS_COUNT(dummy, ##__VA_ARGS__))) \
    ( /*then*/ \
        name_: type_ \
    , /*else*/ \
        name_: OT_EVAL(ujson_struct_field_array(type_, __VA_ARGS__)) \
    ) /*endif*/,

#define ujson_struct_string(name_, size_, ...) \
    ujson_struct_field(name_, String, ##__VA_ARGS__)

#define UJSON_DECLARE_STRUCT(formal_name_, name_, decl_, ...) \
    OT_IIF(OT_NOT(OT_VA_ARGS_COUNT(dummy, ##__VA_ARGS__))) \
    ( /*then*/ \
        rust_attr[derive(RUST_DEFAULT_DERIVE)] /*transform into #[...] */ \
    , /*else*/ \
        rust_attr[derive(__VA_ARGS__)] /*transform into #[...] */ \
    ) /*endif*/ \
    rust_attr[allow(non_camel_case_types)] \
    pub struct name_ { \
        decl_(ujson_struct_field, ujson_struct_string) \
    } \
    rust_attr[allow(dead_code)] \
    pub type formal_name_ = name_ /*eat_semicolon*/

#define ujson_enum_value(formal_name_, name_, ...) \
    pub OT_IIF(OT_NOT(OT_VA_ARGS_COUNT(dummy, ##__VA_ARGS__))) \
    ( /*then*/ \
        name_ \
    , /*else*/ \
        name_ = __VA_ARGS__ \
    ) /*endif*/,

#define UJSON_DECLARE_ENUM(formal_name_, name_, decl_, ...) \
    OT_IIF(OT_NOT(OT_VA_ARGS_COUNT(dummy, ##__VA_ARGS__))) \
    ( /*then*/ \
        rust_attr[derive(RUST_DEFAULT_DERIVE)] /*transform into #[...] */ \
    , /*else*/ \
        rust_attr[derive(__VA_ARGS__)] /*transform into #[...] */ \
    ) /*endif*/ \
    rust_attr[repr(u32)] /* transform into #[...] */ \
    rust_attr[allow(non_camel_case_types)] \
    pub enum name_ { \
        decl_(formal_name_, ujson_enum_value) \
        RUST_ENUM_INTVALUE (u32), \
    } \
    rust_attr[allow(dead_code)] \
    pub type formal_name_ = name_ /*eat_semicolon*/
// clang-format on

//////////////////////////////////////////////////////////////////////
// Combined build-everything macro
//////////////////////////////////////////////////////////////////////
#define UJSON_SERDE_STRUCT(formal_name_, name_, decl_, ...) \
  UJSON_DECLARE_STRUCT(formal_name_, name_, decl_, ##__VA_ARGS__)

#define UJSON_SERDE_ENUM(formal_name_, name_, decl_, ...) \
  UJSON_DECLARE_ENUM(formal_name_, name_, decl_, ##__VA_ARGS__)

#define C_ONLY(x) const _ : () = {/* eat a semicolon */}
#define RUST_ONLY(x) x
#endif  // OPENTITAN_SW_DEVICE_LIB_UJSON_UJSON_RUST_H_
