// -*- mode: C++ -*- // AUTOGENERATED BY glean_parser. DO NOT EDIT. {# The rendered source is autogenerated, but this Jinja2 template is not. Please file bugs! #} /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef mozilla_Metrics_h #define mozilla_Metrics_h #include "mozilla/glean/bindings/MetricTypes.h" #include "mozilla/Tuple.h" #include "mozilla/Maybe.h" #include "nsTArray.h" #include "nsPrintfCString.h" namespace mozilla::glean { {%- macro generate_extra_keys(obj) -%} {% for name, suffix in obj["_generate_enums"] %} {# we always use the `extra` suffix, because we only expose the new event API #} {% set suffix = "Extra" %} {% if obj|attr(name)|length %} {% if obj.has_extra_types %} {{ extra_keys_with_types(obj, name, suffix)|indent }} {% else %} #error "Untyped event extras not supported. Please annotate event extras with a type. See documentation for details. (Metric: {{obj.category}}.{{obj.name}}, defined in: {{obj.defined_in['filepath']}}:{{obj.defined_in['line']}})" {% endif %} {% endif %} {% endfor %} {%- endmacro -%} {%- macro extra_keys_with_types(obj, name, suffix) -%} struct {{ obj.name|Camelize }}{{ suffix }} { {% for item, type in obj|attr(name) %} mozilla::Maybe<{{type|extra_type_name}}> {{ item|camelize }}; {% endfor %} Tuple, nsTArray> ToFfiExtra() const { nsTArray extraKeys; nsTArray extraValues; {% for item, type in obj|attr(name) %} if ({{item|camelize}}) { extraKeys.AppendElement()->AssignASCII("{{item}}"); {% if type == "string" %} extraValues.EmplaceBack({{item|camelize}}.value()); {% elif type == "boolean" %} extraValues.AppendElement()->AssignASCII({{item|camelize}}.value() ? "true" : "false"); {% elif type == "quantity" %} extraValues.EmplaceBack(nsPrintfCString("%d", {{item|camelize}}.value())); {% else %} #error "Glean: Invalid extra key type for metric {{obj.category}}.{{obj.name}}, defined in: {{obj.defined_in['filepath']}}:{{obj.defined_in['line']}})" {% endif %} } {% endfor %} return MakeTuple(std::move(extraKeys), std::move(extraValues)); } }; {%- endmacro %} struct NoExtraKeys; {% for category_name, objs in all_objs.items() %} namespace {{ category_name|snake_case }} { {% for obj in objs.values() %} /** * generated from {{ category_name }}.{{ obj.name }} */ {% if obj|attr("_generate_enums") %} {{ generate_extra_keys(obj) }} {%- endif %} /** * {{ obj.description|wordwrap() | replace('\n', '\n * ') }} */ constexpr impl::{{ obj|type_name }} {{obj.name|snake_case }}({{obj|metric_id}}); {% endfor %} } {% endfor %} } // namespace mozilla::glean #endif // mozilla_Metrics_h