/*
DO NOT MODIFY THIS FILE.  It is automatically generated and changes will be over-written
on the next generation.

It contains enumerations used by the {{stinger.name}} interface.
*/


#pragma once
#include <string>
#include <rapidjson/document.h>
#include "{{stinger.cpp.enum_header_file}}"
#include "structs.hpp"

{%for prop_name, prop in stinger.properties.items()%}
{%- if prop.arg_list| length > 1 %}
{%-if prop.documentation %}/**
{{prop.documentation |commentblock(' * ')}}
 */{%endif%}
struct {{prop.name | UpperCamelCase}}Property {
    static {{prop.name | UpperCamelCase}}Property FromRapidJsonObject(const rapidjson::Value& jsonObj);
    void AddToRapidJsonObject(rapidjson::Value& parent, rapidjson::Document::AllocatorType& allocator) const;
{%-for arg in prop.arg_list %}
    {%if arg.arg_type.name.lower() == "struct"-%}
    {{arg.cpp_type}} {{arg.name}};{%if arg.description %}  ///< {{arg.description}}{%endif%}
    {%-else-%}
    {{arg.cpp_temp_type}} {{arg.name }};{%if arg.description %}  ///< {{arg.description}}{%endif%}
    {%-endif-%}
{%endfor-%}
{# end for arg #}
};
{%elif prop.arg_list| length == 1 %}
{% set arg = prop.arg_list[0] %}
{%if prop.documentation %}/**
 * The `{{prop.name}}` property contains a single field:
{%-if arg.arg_type.name.lower() == "struct"%}
 *   {{arg.cpp_type}} {{arg.name}};{%if arg.description %}  ///< {{arg.description}}{%endif%}
{%-else%}
 *   {{arg.cpp_temp_type}} {{arg.name }};{%if arg.description %}  ///< {{arg.description}}{%endif%}
{%-endif%}
 *
 * Because there is only one field, no outer-structure is needed. 
 *
{{prop.documentation |commentblock(' * ')}}
 */{%endif%}
typedef {%if arg.arg_type.name.lower() == "struct"%}{{arg.cpp_type}}{%else%}{{arg.cpp_temp_type}}{%endif%} {{prop.name | UpperCamelCase}}Property;
{%endif%}
{%endfor%}