{#
  Copyright The OpenTelemetry Authors
  SPDX-License-Identifier: Apache-2.0

  This file is:
  - a Jinja template,
  - used to generate semantic conventions,
  - using weaver.

  For doc on the template syntax:
  https://jinja.palletsprojects.com/en/3.0.x/

  For doc on the semantic conventions:
  https://github.com/open-telemetry/semantic-conventions

  For doc on weaver:
  https://github.com/open-telemetry/weaver
#}
/*
 * Copyright The OpenTelemetry Authors
 * SPDX-License-Identifier: Apache-2.0
 */

/*
 * DO NOT EDIT, this is an Auto-generated file from:
 * buildscripts/semantic-convention/templates/registry/semantic_metrics-h.j2
 */
{# ========================================================================== #}
{#
    DESIGN NOTES:
    - Use the debug flag to dump the semantic convention data
      in the generated output, to inspect it.
    - Some instruments are not supported in the SDK.
      For these, we do not generate the code.
#}
{# ========================================================================== #}

{% set debug = false %}

{% set file_name = ctx.output + (ctx.root_namespace | snake_case) ~ "_metrics.h" %}
{{ template.set_file_name(file_name) }}

{% set metrics = ctx.metrics | list %}

{% macro metric_namespace(ctx) %}
{{ ctx.root_namespace | snake_case }}
{% endmacro %}

{% macro func_metric_name(metric) %}
{{ metric.id | pascal_case }}
{% endmacro %}

{% macro var_metric_name(metric) %}
k{{ metric.id | pascal_case }}
{% endmacro %}

{% macro descr_metric_name(metric) %}
descr{{ metric.id | pascal_case }}
{% endmacro %}

{% macro unit_metric_name(metric) %}
unit{{ metric.id | pascal_case }}
{% endmacro %}

{% macro sync_instrument_min_abi_version(metric) %}
{{ metric.instrument | map_text("cpp_sync_min_abi_version") | trim }}
{% endmacro %}

{% macro sync_instrument_int64_type(metric) %}
{{ metric.instrument | map_text("cpp_sync_instrument_to_int64_type") | trim }}
{% endmacro %}

{% macro sync_instrument_double_type(metric) %}
{{ metric.instrument | map_text("cpp_sync_instrument_to_double_type") | trim }}
{% endmacro %}

{% macro sync_instrument_int64_factory(metric) %}
{{ metric.instrument | map_text("cpp_sync_instrument_to_int64_factory") }}
{% endmacro %}

{% macro sync_instrument_double_factory(metric) %}
{{ metric.instrument | map_text("cpp_sync_instrument_to_double_factory") }}
{% endmacro %}

{% macro async_instrument_min_abi_version(metric) %}
{{ metric.instrument | map_text("cpp_async_min_abi_version") | trim }}
{% endmacro %}

{% macro async_instrument_type(metric) %}
{{ metric.instrument | map_text("cpp_async_instrument_to_type") }}
{% endmacro %}

{% macro async_instrument_int64_factory(metric) %}
{{ metric.instrument | map_text("cpp_async_instrument_to_int64_factory") }}
{% endmacro %}

{% macro async_instrument_double_factory(metric) %}
{{ metric.instrument | map_text("cpp_async_instrument_to_double_factory") }}
{% endmacro %}

{% set cpp_metric_namespace = metric_namespace(ctx) %}

{# ========================================================================== #}

#pragma once

#include "opentelemetry/common/macros.h"
#include "opentelemetry/metrics/meter.h"
#include "opentelemetry/version.h"

OPENTELEMETRY_BEGIN_NAMESPACE
namespace semconv
{
namespace {{ cpp_metric_namespace -}}
{

{% for metric in ctx.metrics %}
    {% if debug %}
// DEBUG: {{ metric }}
    {% endif %}
    {% set f_metric_name = func_metric_name(metric) %}
    {% set v_metric_name = var_metric_name(metric) %}
    {% set descr = descr_metric_name(metric) %}
    {% set unit = unit_metric_name(metric) %}
    {% set sync_min_abi_version = (sync_instrument_min_abi_version(metric)) %}
    {% set async_min_abi_version = (async_instrument_min_abi_version(metric)) %}
    {% set sync_int64_type = sync_instrument_int64_type(metric) %}
    {% set sync_double_type = sync_instrument_double_type(metric) %}
    {% set async_type = async_instrument_type(metric) %}
    {% set sync_int64_factory = sync_instrument_int64_factory(metric) %}
    {% set sync_double_factory = sync_instrument_double_factory(metric) %}
    {% set async_int64_factory = async_instrument_int64_factory(metric) %}
    {% set async_double_factory = async_instrument_double_factory(metric) %}
    {% set excluded = metric.id in ctx.excluded_attributes %}
    {% if excluded %}
#if 0
// Excluded metric:
    {% endif %}
    {% if metric is deprecated %}
{{ [metric.brief, "\n", "@deprecated", metric.deprecated, "\n", metric.note, "\n", metric.instrument] | comment(ident=2) }}
OPENTELEMETRY_DEPRECATED
    {% else %}
{{ [metric.brief, "\n", metric.note, "\n", metric.instrument] | comment(ident=2) }}
    {% endif %}
static constexpr const char *{{v_metric_name}} = "{{metric.metric_name}}";
    {% if metric is deprecated %}
OPENTELEMETRY_DEPRECATED
    {% endif %}
static constexpr const char *{{descr}} = "{{metric.brief}}";
    {% if metric is deprecated %}
OPENTELEMETRY_DEPRECATED
    {% endif %}
static constexpr const char *{{unit}} = "{{metric.unit}}";

    {% if sync_min_abi_version|trim != "0" %}
        {% if sync_min_abi_version|trim != "1" %}
#if OPENTELEMETRY_ABI_VERSION_NO >= {{sync_min_abi_version}}
        {% endif %}
        {% if metric is deprecated %}
OPENTELEMETRY_DEPRECATED
        {% endif %}
static inline nostd::unique_ptr<{{sync_int64_type-}}>
CreateSyncInt64{{f_metric_name-}}(metrics::Meter *meter)
{
  return meter->{{sync_int64_factory}}(
    {{v_metric_name}},
    {{descr}},
    {{unit}});
}

        {% if metric is deprecated %}
OPENTELEMETRY_DEPRECATED
        {% endif %}
static inline nostd::unique_ptr<{{sync_double_type-}}>
CreateSyncDouble{{f_metric_name-}}(metrics::Meter *meter)
{
  return meter->{{sync_double_factory}}(
    {{v_metric_name}},
    {{descr}},
    {{unit}});
}
        {% if sync_min_abi_version|trim != "1" %}
#endif /* OPENTELEMETRY_ABI_VERSION_NO */
        {% endif %}
    {% endif %}

    {% if async_min_abi_version|trim != "0" %}
        {% if async_min_abi_version|trim != "1" %}
#if OPENTELEMETRY_ABI_VERSION_NO >= {{async_min_abi_version}}
        {% endif %}
        {% if metric is deprecated %}
OPENTELEMETRY_DEPRECATED
        {% endif %}
static inline nostd::shared_ptr<{{async_type-}}>
CreateAsyncInt64{{f_metric_name-}}(metrics::Meter *meter)
{
  return meter->{{async_int64_factory}}(
    {{v_metric_name}},
    {{descr}},
    {{unit}});
}

        {% if metric is deprecated %}
OPENTELEMETRY_DEPRECATED
        {% endif %}
static inline nostd::shared_ptr<{{async_type-}}>
CreateAsyncDouble{{f_metric_name-}}(metrics::Meter *meter)
{
  return meter->{{async_double_factory}}(
    {{v_metric_name}},
    {{descr}},
    {{unit}});
}
        {% if async_min_abi_version|trim != "1" %}
#endif /* OPENTELEMETRY_ABI_VERSION_NO */
        {% endif %}
    {% endif %}

    {% if excluded %}
#endif /* 0 */
    {% endif %}

{% endfor %}

}
}
OPENTELEMETRY_END_NAMESPACE

