blob: da8be542260b43421becb59e3db6db1598013389 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_METRICS_STRUCTURED_EVENT_VALIDATOR_H_
#define COMPONENTS_METRICS_STRUCTURED_EVENT_VALIDATOR_H_
#include <cstdint>
#include <optional>
#include <string>
#include <string_view>
#include <unordered_map>
#include "components/metrics/structured/enums.h"
#include "components/metrics/structured/event.h"
namespace metrics::structured {
// Interface to be implemented by codegen for every event to validate
// messages received by the structured metric service.
class EventValidator {
public:
// Metadata about a registered metric.
struct MetricMetadata {
Event::MetricType metric_type;
uint64_t metric_name_hash;
};
// Should not be copied or moved.
EventValidator(const EventValidator&) = delete;
EventValidator& operator=(const EventValidator& other) = delete;
virtual ~EventValidator();
// Returns the event validator if |metric_name| is a valid metric for this
// event. This method is virtual because a static constexpr map will be
// defined within each event validator implementation.
std::optional<MetricMetadata> GetMetricMetadata(
const std::string& metric_name) const;
std::optional<std::string_view> GetMetricName(
uint64_t metric_name_hash) const;
uint64_t event_hash() const;
bool can_force_record() const;
protected:
// Should not be constructed directly.
explicit EventValidator(uint64_t event_hash, bool force_record);
std::unordered_map<std::string_view, EventValidator::MetricMetadata>
metric_metadata_;
std::unordered_map<uint64_t, std::string_view> metrics_name_map_;
private:
uint64_t event_hash_;
// Flag for whether an event can be recorded, not uploaded, before a user has
// been able to opt-in.
bool force_record_;
};
} // namespace metrics::structured
#endif // COMPONENTS_METRICS_STRUCTURED_EVENT_VALIDATOR_H_