blob: aa889b236509fc6fbf5c72d43046c48dba4faa66 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/metrics/structured/mojom/event_mojom_traits.h"
#include <map>
#include <string>
#include "base/strings/string_number_conversions.h"
#include "base/values.h"
#include "components/metrics/structured/event.h"
#include "components/metrics/structured/mojom/event.mojom.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace mojo {
// static
metrics::structured::mojom::MetricValueDataView::Tag
UnionTraits<metrics::structured::mojom::MetricValueDataView,
metrics::structured::Event::MetricValue>::
GetTag(const metrics::structured::Event::MetricValue& metric_value) {
switch (metric_value.type) {
case metrics::structured::Event::MetricType::kHmac:
return metrics::structured::mojom::MetricValueDataView::Tag::kHmacValue;
case metrics::structured::Event::MetricType::kLong:
return metrics::structured::mojom::MetricValueDataView::Tag::kLongValue;
case metrics::structured::Event::MetricType::kInt:
return metrics::structured::mojom::MetricValueDataView::Tag::kIntValue;
case metrics::structured::Event::MetricType::kDouble:
return metrics::structured::mojom::MetricValueDataView::Tag::kDoubleValue;
case metrics::structured::Event::MetricType::kRawString:
return metrics::structured::mojom::MetricValueDataView::Tag::kRawStrValue;
case metrics::structured::Event::MetricType::kBoolean:
return metrics::structured::mojom::MetricValueDataView::Tag::kBoolValue;
}
}
// static
bool UnionTraits<metrics::structured::mojom::MetricValueDataView,
metrics::structured::Event::MetricValue>::
Read(metrics::structured::mojom::MetricValueDataView metric,
metrics::structured::Event::MetricValue* out) {
switch (metric.tag()) {
case metrics::structured::mojom::MetricValueDataView::Tag::kHmacValue: {
std::string hmac_value;
if (!metric.ReadHmacValue(&hmac_value))
return false;
out->type = metrics::structured::Event::MetricType::kHmac;
out->value = base::Value(std::move(hmac_value));
break;
}
case metrics::structured::mojom::MetricValueDataView::Tag::kLongValue:
out->type = metrics::structured::Event::MetricType::kLong;
out->value = base::Value(base::NumberToString(metric.long_value()));
break;
case metrics::structured::mojom::MetricValueDataView::Tag::kIntValue:
out->type = metrics::structured::Event::MetricType::kInt;
out->value = base::Value(metric.int_value());
break;
case metrics::structured::mojom::MetricValueDataView::Tag::kDoubleValue:
out->type = metrics::structured::Event::MetricType::kDouble;
out->value = base::Value(metric.double_value());
break;
case metrics::structured::mojom::MetricValueDataView::Tag::kRawStrValue: {
std::string raw_str_value;
if (!metric.ReadRawStrValue(&raw_str_value))
return false;
out->type = metrics::structured::Event::MetricType::kRawString;
out->value = base::Value(std::move(raw_str_value));
break;
}
case metrics::structured::mojom::MetricValueDataView::Tag::kBoolValue:
out->type = metrics::structured::Event::MetricType::kBoolean;
out->value = base::Value(metric.bool_value());
break;
}
return true;
}
// static
bool StructTraits<metrics::structured::mojom::EventDataView,
metrics::structured::Event>::
Read(metrics::structured::mojom::EventDataView event,
metrics::structured::Event* out) {
std::string project_name, event_name;
std::map<std::string, metrics::structured::Event::MetricValue> metrics;
if (!event.ReadProjectName(&project_name) ||
!event.ReadEventName(&event_name) || !event.ReadMetrics(&metrics))
return false;
*out = metrics::structured::Event(project_name, event_name);
for (auto&& metric : metrics) {
if (!out->AddMetric(metric.first, metric.second.type,
std::move(metric.second.value)))
return false;
}
return true;
}
} // namespace mojo