// -*- mode: C++ -*-

// AUTOGENERATED BY glean_parser.  DO NOT EDIT.

/* 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/Maybe.h"
#include "nsTArray.h"
#include "nsPrintfCString.h"

#include <tuple>

namespace mozilla::glean {
struct NoExtraKeys;
enum class DynamicLabel: uint16_t { };

namespace test {
  /**
   * generated from test.boolean_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::BooleanMetric boolean_metric(1);

  /**
   * generated from test.counter_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::CounterMetric counter_metric(2);

  /**
   * generated from test.custom_distribution_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::CustomDistributionMetric custom_distribution_metric(3);

  /**
   * generated from test.labeled_boolean_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::Labeled<impl::BooleanMetric, DynamicLabel> labeled_boolean_metric(4);

  /**
   * generated from test.labeled_boolean_metric_labels
   */
  enum class LabeledBooleanMetricLabelsLabel: uint16_t {
      eOneLabel = 0,
      eTwoLabels = 1,
      eThreeLabels = 2,
      eFourLabels = 3,
      eFiveLabels = 4,
      eSixLabels = 5,
      eSevenLabels = 6,
      eEightLabels = 7,
      eNineLabels = 8,
      eTenLabels = 9,
      e__Other__,
    };
  /**
   * A multi-line
     * description
   */
  constexpr impl::Labeled<impl::BooleanMetric, LabeledBooleanMetricLabelsLabel> labeled_boolean_metric_labels(5);

  /**
   * generated from test.labeled_counter_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::Labeled<impl::CounterMetric, DynamicLabel> labeled_counter_metric(6);

  /**
   * generated from test.labeled_counter_metric_labels
   */
  enum class LabeledCounterMetricLabelsLabel: uint16_t {
      eOneLabel = 0,
      eTwoLabels = 1,
      e__Other__,
    };
  /**
   * A multi-line
     * description
   */
  constexpr impl::Labeled<impl::CounterMetric, LabeledCounterMetricLabelsLabel> labeled_counter_metric_labels(7);

  /**
   * generated from test.labeled_string_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::Labeled<impl::StringMetric, DynamicLabel> labeled_string_metric(8);

  /**
   * generated from test.labeled_string_metric_labels
   */
  enum class LabeledStringMetricLabelsLabel: uint16_t {
      eOneLabel = 0,
      eTwoLabels = 1,
      e__Other__,
    };
  /**
   * A multi-line
     * description
   */
  constexpr impl::Labeled<impl::StringMetric, LabeledStringMetricLabelsLabel> labeled_string_metric_labels(9);

  /**
   * generated from test.memory_distribution_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::MemoryDistributionMetric memory_distribution_metric(10);

  /**
   * generated from test.string_list_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::StringListMetric string_list_metric(11);

  /**
   * generated from test.string_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::StringMetric string_metric(12);

  /**
   * generated from test.text_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::TextMetric text_metric(13);

  /**
   * generated from test.timespan_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::TimespanMetric timespan_metric(14);

  /**
   * generated from test.timing_distribution_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::TimingDistributionMetric timing_distribution_metric(15);

}
namespace test_nested {

  /**
   * generated from test.nested.datetime_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::DatetimeMetric datetime_metric(17);

  /**
   * generated from test.nested.event_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::EventMetric<NoExtraKeys> event_metric(18);

  /**
   * generated from test.nested.event_metric_with_extra
   */
    struct EventMetricWithExtraExtra {
      mozilla::Maybe<nsCString> anExtraKey;
      mozilla::Maybe<nsCString> anotherExtraKey;

      std::tuple<nsTArray<nsCString>, nsTArray<nsCString>> ToFfiExtra() const {
        nsTArray<nsCString> extraKeys;
        nsTArray<nsCString> extraValues;
        if (anExtraKey) {
          extraKeys.AppendElement()->AssignASCII("an_extra_key");
          extraValues.EmplaceBack(anExtraKey.value());
        }
        if (anotherExtraKey) {
          extraKeys.AppendElement()->AssignASCII("another_extra_key");
          extraValues.EmplaceBack(anotherExtraKey.value());
        }
        return std::make_tuple(std::move(extraKeys), std::move(extraValues));
      }
    };
  /**
   * A multi-line
     * description
   */
  constexpr impl::EventMetric<EventMetricWithExtraExtra> event_metric_with_extra(19);

  /**
   * generated from test.nested.external_denominator
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::DenominatorMetric external_denominator(20);

  /**
   * generated from test.nested.optimizable_counter_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::CounterMetric optimizable_counter_metric(21);

  /**
   * generated from test.nested.quantity_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::QuantityMetric quantity_metric(22);

  /**
   * generated from test.nested.rate_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::RateMetric rate_metric(23);

  /**
   * generated from test.nested.rate_with_external_denominator
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::NumeratorMetric rate_with_external_denominator(24);

  /**
   * generated from test.nested.uuid_metric
   */
  /**
   * A multi-line
     * description
   */
  constexpr impl::UuidMetric uuid_metric(25);

}

} // namespace mozilla::glean

#endif // mozilla_Metrics_h
