blob: 5b17f483695bbdc45d8d0ee1593c44731cdbaf23 [file]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/attribution_reporting/debug_types.h"
#include <string_view>
#include "base/containers/enum_set.h"
#include "base/containers/fixed_flat_map.h"
#include "base/notreached.h"
#include "base/types/expected.h"
#include "components/attribution_reporting/debug_types.mojom.h"
#include "components/attribution_reporting/parsing_utils.h"
namespace attribution_reporting {
namespace {
using ::attribution_reporting::mojom::DebugDataType;
#define SOURCE_DEBUG_DATA_TYPES(X) \
X(kSourceChannelCapacityLimit, "source-channel-capacity-limit") \
X(kSourceDestinationGlobalRateLimit, "source-destination-global-rate-limit") \
X(kSourceDestinationLimit, "source-destination-limit") \
X(kSourceDestinationLimitReplaced, "source-destination-limit-replaced") \
X(kSourceDestinationPerDayRateLimit, \
"source-destination-per-day-rate-limit") \
X(kSourceDestinationRateLimit, "source-destination-rate-limit") \
X(kSourceMaxEventStatesLimit, "source-max-event-states-limit") \
X(kSourceNoised, "source-noised") \
X(kSourceReportingOriginLimit, "source-reporting-origin-limit") \
X(kSourceReportingOriginPerSiteLimit, \
"source-reporting-origin-per-site-limit") \
X(kSourceScopesChannelCapacityLimit, "source-scopes-channel-capacity-limit") \
X(kSourceStorageLimit, "source-storage-limit") \
X(kSourceSuccess, "source-success") \
X(kSourceTriggerStateCardinalityLimit, \
"source-trigger-state-cardinality-limit") \
X(kSourceUnknownError, "source-unknown-error")
#define TRIGGER_DEBUG_DATA_TYPES(X) \
X(kTriggerAggregateAttributionsPerSourceDestinationLimit, \
"trigger-aggregate-attributions-per-source-destination-limit") \
X(kTriggerAggregateDeduplicated, "trigger-aggregate-deduplicated") \
X(kTriggerAggregateExcessiveReports, "trigger-aggregate-excessive-reports") \
X(kTriggerAggregateInsufficientNamedBudget, \
"trigger-aggregate-insufficient-named-budget") \
X(kTriggerAggregateInsufficientBudget, \
"trigger-aggregate-insufficient-budget") \
X(kTriggerAggregateNoContributions, "trigger-aggregate-no-contributions") \
X(kTriggerAggregateReportWindowPassed, \
"trigger-aggregate-report-window-passed") \
X(kTriggerAggregateStorageLimit, "trigger-aggregate-storage-limit") \
X(kTriggerEventAttributionsPerSourceDestinationLimit, \
"trigger-event-attributions-per-source-destination-limit") \
X(kTriggerEventDeduplicated, "trigger-event-deduplicated") \
X(kTriggerEventExcessiveReports, "trigger-event-excessive-reports") \
X(kTriggerEventLowPriority, "trigger-event-low-priority") \
X(kTriggerEventNoMatchingConfigurations, \
"trigger-event-no-matching-configurations") \
X(kTriggerEventNoMatchingTriggerData, \
"trigger-event-no-matching-trigger-data") \
X(kTriggerEventNoise, "trigger-event-noise") \
X(kTriggerEventReportWindowNotStarted, \
"trigger-event-report-window-not-started") \
X(kTriggerEventReportWindowPassed, "trigger-event-report-window-passed") \
X(kTriggerEventStorageLimit, "trigger-event-storage-limit") \
X(kTriggerNoMatchingFilterData, "trigger-no-matching-filter-data") \
X(kTriggerNoMatchingSource, "trigger-no-matching-source") \
X(kTriggerReportingOriginLimit, "trigger-reporting-origin-limit") \
X(kTriggerUnknownError, "trigger-unknown-error")
#define OTHER_DEBUG_DATA_TYPES(X) \
X(kHeaderParsingError, "header-parsing-error") \
X(kOsSourceDelegated, "os-source-delegated") \
X(kOsTriggerDelegated, "os-trigger-delegated")
} // namespace
std::string_view SerializeDebugDataType(DebugDataType data_type) {
#define TYPE_TO_STR(name, str) \
case DebugDataType::name: \
return str;
switch (data_type) {
SOURCE_DEBUG_DATA_TYPES(TYPE_TO_STR)
TRIGGER_DEBUG_DATA_TYPES(TYPE_TO_STR)
OTHER_DEBUG_DATA_TYPES(TYPE_TO_STR)
}
#undef TYPE_TO_STR
NOTREACHED();
}
#define STR_TO_TYPE(name, str) {str, DebugDataType::name},
base::expected<DebugDataType, ParseError> ParseSourceDebugDataType(
std::string_view str) {
static constexpr auto kTypes =
base::MakeFixedFlatMap<std::string_view, DebugDataType>(
{SOURCE_DEBUG_DATA_TYPES(STR_TO_TYPE)});
auto it = kTypes.find(str);
if (it == kTypes.end()) {
return base::unexpected(ParseError());
}
return it->second;
}
base::expected<DebugDataType, ParseError> ParseTriggerDebugDataType(
std::string_view str) {
static constexpr auto kTypes =
base::MakeFixedFlatMap<std::string_view, DebugDataType>(
{TRIGGER_DEBUG_DATA_TYPES(STR_TO_TYPE)});
auto it = kTypes.find(str);
if (it == kTypes.end()) {
return base::unexpected(ParseError());
}
return it->second;
}
#undef STR_TO_TYPE
#define ENUM_NAME(name, str) DebugDataType::name,
DebugDataTypes SourceDebugDataTypes() {
return {SOURCE_DEBUG_DATA_TYPES(ENUM_NAME)};
}
DebugDataTypes TriggerDebugDataTypes() {
return {TRIGGER_DEBUG_DATA_TYPES(ENUM_NAME)};
}
#undef ENUM_NAME
#undef OTHER_DEBUG_DATA_TYPES
#undef TRIGGER_DEBUG_DATA_TYPES
#undef SOURCE_DEBUG_DATA_TYPES
} // namespace attribution_reporting