|  | # -*- coding: utf-8 -*- | 
|  | # 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. | 
|  |  | 
|  | HEADER_FILE_TEMPLATE = """\ | 
|  | // Generated from gen_validator.py. DO NOT EDIT! | 
|  | // source: structured.xml | 
|  |  | 
|  | #ifndef {file.guard_path} | 
|  | #define {file.guard_path} | 
|  |  | 
|  | #include <memory> | 
|  | #include <optional> | 
|  | #include <string> | 
|  | #include <unordered_map> | 
|  |  | 
|  | #include "base/no_destructor.h" | 
|  | #include "base/strings/string_piece.h" | 
|  | #include "components/metrics/structured/project_validator.h" | 
|  |  | 
|  | namespace metrics {{ | 
|  | namespace structured {{ | 
|  | namespace validator {{ | 
|  |  | 
|  | class Validators final {{ | 
|  |  | 
|  | public: | 
|  | Validators(); | 
|  |  | 
|  | Validators(const Validators&) = delete; | 
|  | Validators& operator=(const Validators&) = delete; | 
|  |  | 
|  | void Initialize(); | 
|  |  | 
|  | const ProjectValidator* | 
|  | GetProjectValidator(base::StringPiece project_name) const; | 
|  |  | 
|  | std::optional<base::StringPiece> | 
|  | GetProjectName(uint64_t project_name_hash) const; | 
|  |  | 
|  | static Validators* Get(); | 
|  |  | 
|  | private: | 
|  | friend class base::NoDestructor<Validators>; | 
|  |  | 
|  | std::unordered_map<base::StringPiece, std::unique_ptr<ProjectValidator>> | 
|  | validators_; | 
|  | std::unordered_map<uint64_t, base::StringPiece> project_name_map_; | 
|  | }}; | 
|  |  | 
|  | }}  // namespace validator | 
|  | }}  // namespace structured | 
|  | }}  // namespace metrics | 
|  |  | 
|  | #endif  // {file.guard_path}\ | 
|  | """ | 
|  |  | 
|  | IMPL_FILE_TEMPLATE = """\ | 
|  | // Generated from gen_validator.py. DO NOT EDIT! | 
|  | // source: structured.xml | 
|  |  | 
|  | #include "components/metrics/structured/structured_metrics_validator.h" | 
|  |  | 
|  | #include <cstdint> | 
|  | #include <string> | 
|  |  | 
|  | #include "components/metrics/structured/enums.h" | 
|  | #include "components/metrics/structured/event.h" | 
|  | #include "components/metrics/structured/event_validator.h" | 
|  | #include "components/metrics/structured/project_validator.h" | 
|  | #include <optional> | 
|  | #include "third_party/metrics_proto/structured_data.pb.h" | 
|  |  | 
|  | namespace metrics {{ | 
|  | namespace structured {{ | 
|  |  | 
|  | namespace {{ | 
|  |  | 
|  | //---------------------EventValidator Classes---------------------------------- | 
|  | {event_code} | 
|  | //---------------------ProjectValidator Classes--------------------------------- | 
|  | {projects_code} | 
|  |  | 
|  | }} | 
|  |  | 
|  | namespace validator {{ | 
|  |  | 
|  | Validators::Validators() {{ | 
|  | Initialize(); | 
|  | }} | 
|  |  | 
|  | void Validators::Initialize() {{ | 
|  | {project_map}; | 
|  |  | 
|  | {name_map}; | 
|  | }} | 
|  |  | 
|  | const ProjectValidator* | 
|  | Validators::GetProjectValidator(base::StringPiece project_name) const {{ | 
|  | const auto it = validators_.find(project_name); | 
|  | if (it == validators_.end()) | 
|  | return nullptr; | 
|  | return it->second.get(); | 
|  | }} | 
|  |  | 
|  | std::optional<base::StringPiece> | 
|  | Validators::GetProjectName(uint64_t project_name_hash) const {{ | 
|  | const auto it = project_name_map_.find(project_name_hash); | 
|  | if (it == project_name_map_.end()) | 
|  | return std::nullopt; | 
|  | // This lookup will never fail. | 
|  | return it->second; | 
|  | }} | 
|  |  | 
|  | // static | 
|  | Validators* Validators::Get() {{ | 
|  | static base::NoDestructor<Validators> validators; | 
|  | return validators.get(); | 
|  | }} | 
|  |  | 
|  | }} // namespace validator | 
|  | }}  // namespace structured | 
|  | }}  // namespace metrics\ | 
|  | """ | 
|  |  | 
|  | IMPL_PROJECT_VALIDATOR_TEMPLATE = """\ | 
|  | class {project.validator} final : | 
|  | public ::metrics::structured::ProjectValidator {{ | 
|  | public: | 
|  | {project.validator}(); | 
|  | ~{project.validator}() override; | 
|  |  | 
|  | void Initialize(); | 
|  |  | 
|  | static constexpr uint64_t kProjectNameHash = UINT64_C({project.name_hash}); | 
|  | static constexpr IdType kIdType = IdType::{project.id_type}; | 
|  | static constexpr IdScope kIdScope = IdScope::{project.id_scope}; | 
|  | static constexpr EventType kEventType = | 
|  | StructuredEventProto_EventType_{project.event_type}; | 
|  | static constexpr int kKeyRotationPeriod = | 
|  | {project.key_rotation_period}; | 
|  | }}; | 
|  |  | 
|  | {project.validator}::{project.validator}() : | 
|  | ::metrics::structured::ProjectValidator( | 
|  | {project.validator}::kProjectNameHash, | 
|  | {project.validator}::kIdType, | 
|  | {project.validator}::kIdScope, | 
|  | {project.validator}::kEventType, | 
|  | {project.validator}::kKeyRotationPeriod | 
|  | ) | 
|  | {{ | 
|  | Initialize(); | 
|  | }} | 
|  |  | 
|  | void {project.validator}::Initialize() {{ | 
|  | {event_validator_map}; | 
|  |  | 
|  | {event_name_map}; | 
|  | }} | 
|  |  | 
|  | {project.validator}::~{project.validator}() = default; | 
|  |  | 
|  | """ | 
|  |  | 
|  | IMPL_EVENT_VALIDATOR_TEMPLATE = """\ | 
|  | class {event.validator_name} final : | 
|  | public ::metrics::structured::EventValidator {{ | 
|  | public: | 
|  | {event.validator_name}(); | 
|  | ~{event.validator_name}(); | 
|  |  | 
|  | void Initialize(); | 
|  |  | 
|  | static constexpr uint64_t kEventNameHash = UINT64_C({event.name_hash}); | 
|  | }}; | 
|  |  | 
|  | {event.validator_name}::{event.validator_name}() : | 
|  | ::metrics::structured::EventValidator({event.validator_name}::kEventNameHash, | 
|  | {event.force_record}) | 
|  | {{ | 
|  | Initialize(); | 
|  | }} | 
|  |  | 
|  | {event.validator_name}::~{event.validator_name}() = default; | 
|  |  | 
|  | void {event.validator_name}::Initialize() {{ | 
|  | metric_metadata_ = {{ | 
|  | {metric_hash_map} | 
|  | }}; | 
|  |  | 
|  |  | 
|  | metrics_name_map_ = {{ | 
|  | {metrics_name_map} | 
|  | }}; | 
|  | }} | 
|  | """ |